如何在nohup执行的多命令bash脚本中向stdout发送指定消息?
解决nohup执行多命令时向终端输出特定消息的问题
nohup默认会把进程的stdout和stderr重定向到nohup.out,你之前的写法(把echo转到stderr再整体重定向回stdout)会让所有输出都进入nohup.out,达不到预期效果。下面提供两种可行的解决办法:
方法一:直接输出到控制终端/dev/tty
/dev/tty是当前进程的控制终端设备文件,不管nohup如何重定向进程输出流,直接向这个文件写入内容就能显示在终端上。示例代码:
nohup sh -c " \ echo 'some message 1' > /dev/tty && \ some_command_1 && \ echo 'some message 2' > /dev/tty && \ some_command_2 && \ ..." &
some_command_1、some_command_2的输出依然会被nohup重定向到nohup.out,符合你的需求;echo的内容直接输出到当前终端,不会进入nohup.out。
方法二:保存原终端的文件描述符
在启动shell时先把原终端的stdout保存到一个备用文件描述符(比如3),需要输出消息时定向到这个描述符即可:
nohup sh -c " \ # 把原终端的stdout保存到fd 3 exec 3>/dev/tty && \ echo 'some message 1' >&3 && \ some_command_1 && \ echo 'some message 2' >&3 && \ some_command_2 && \ # 用完关闭备用fd exec 3>&- \ " &
这种方法和方法一本质类似,只是通过文件描述符操作实现,适合需要多次复用终端输出的场景。
补充说明
你之前的写法存在两个错误:
echo ... >$2是语法错误,正确的stderr重定向写法是>&2;- 结尾的
2>&1会把整个sh进程的stderr合并到stdout,而nohup已经将stdout重定向到nohup.out,所以即使echo输出到stderr,最终还是会进入nohup.out,这就是你的方法未生效的原因。
内容的提问来源于stack exchange,提问作者HatteSoul
相关产品推荐
相关产品推荐

