假设我们以以下方式调用nohup:
nohup foo.py -n 20 2>&1 &这将将输出写入nohup.out。如何使整个命令nohup foo.py -n 20 2>&1 &位于nohup.out (或任何其他指定的输出文件)的顶部,然后将执行的命令的常规输出写入该文件?
这样做的原因纯粹是为了调试,因为会有成千上万这样的命令被执行,而且其中一些命令经常会因为各种原因而崩溃。这就像保存在文件中的基本报告一样,执行的命令写在顶部,后面跟着执行命令的输出。
发布于 2022-09-17 17:06:25
一个直截了当的备选方案是:
myNohup() {
(
set +m # disable job control
[[ -t 0 ]] && exec </dev/null # redirect stdin away from tty
[[ -t 1 ]] && exec >nohup.out # redirect stdout away from tty
[[ -t 2 ]] && exec 2>&1 # redirect stderr away from tty
set -x # enable trace logging of all commands run
"$@" # run our arguments as a command
) & disown -h "$!" # do not forward any HUP signal to the child process
}要定义一个命令,我们可以使用以下方法进行测试:
waitAndWrite() { sleep 5; echo "finished"; }...and运行:
myNohup waitAndWrite...will立即返回,5秒后,在nohup.out中保留以下内容
+ waitAndWrite
+ sleep 5
+ echo finished
finished如果您只想编写精确的运行命令,而不使用xtrace的副作用,请将set -x替换为(假设bash5.0或更高版本) printf '%s\n' "${*@Q}"。
对于较早版本的bash,您可以考虑使用printf '%q ' "$@"; printf '\n'。
这与问题所提出的略有不同:
set -x记录。当您运行nohup foo 2>&1 &时,2>&1不是作为参数传递给nohup的;而是在nohup启动之前,shell会这样做。类似地,&不是参数,而是对shell的指令,而不是对wait()的指令,以便子进程在继续执行以后的命令之前完成。https://stackoverflow.com/questions/73756731
复制相似问题