首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将已执行的命令追加到输出文件的顶部。

将已执行的命令追加到输出文件的顶部。
EN

Stack Overflow用户
提问于 2022-09-17 16:45:25
回答 1查看 20关注 0票数 0

假设我们以以下方式调用nohup

代码语言:javascript
运行
复制
nohup foo.py -n 20 2>&1 &

这将将输出写入nohup.out。如何使整个命令nohup foo.py -n 20 2>&1 &位于nohup.out (或任何其他指定的输出文件)的顶部,然后将执行的命令的常规输出写入该文件?

这样做的原因纯粹是为了调试,因为会有成千上万这样的命令被执行,而且其中一些命令经常会因为各种原因而崩溃。这就像保存在文件中的基本报告一样,执行的命令写在顶部,后面跟着执行命令的输出。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-17 17:06:25

一个直截了当的备选方案是:

代码语言:javascript
运行
复制
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
}

要定义一个命令,我们可以使用以下方法进行测试:

代码语言:javascript
运行
复制
waitAndWrite() { sleep 5; echo "finished"; }

...and运行:

代码语言:javascript
运行
复制
myNohup waitAndWrite

...will立即返回,5秒后,在nohup.out中保留以下内容

代码语言:javascript
运行
复制
+ waitAndWrite
+ sleep 5
+ echo finished
finished

如果您只想编写精确的运行命令,而不使用xtrace的副作用,请将set -x替换为(假设bash5.0或更高版本) printf '%s\n' "${*@Q}"

对于较早版本的bash,您可以考虑使用printf '%q ' "$@"; printf '\n'

这与问题所提出的略有不同:

  • 重定向和其他shell指令不会被set -x记录。当您运行nohup foo 2>&1 &时,2>&1不是作为参数传递给nohup的;而是在nohup启动之前,shell会这样做。类似地,&不是参数,而是对shell的指令,而不是对wait()的指令,以便子进程在继续执行以后的命令之前完成。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73756731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档