如何从 shell 脚本启动后台进程并记录进程的输出?

如何从 shell 脚本启动后台进程并记录进程的输出?

我有一个类似于以下内容的 shell 脚本:

#!/bin/bash

# Here is where I set a bunch of environment variables that are
# used by the process invoked below...

# Now I want to invoke the process in the background and redirect
# all of the output to a log file.
nohup name-of-executable > logfile.out 2>&1 &

# Finally, I record the PID of the process before the script exits.
echo $! > proc.pid

用例是,有人会定期通过 ssh 进入这台计算机,启动此进程,然后注销该计算机。我只需要创建日志文件,以便可以调试流程执行期间遇到的任何问题。

使用上面的脚本时,进程正确执行,创建日志文件,但没有输出写入日志文件。我刚刚得到一个零长度的文件。

如果我nohup name-of-executable > logfile.out 2>&1 &直接从命令行运行该命令,该进程将按预期执行并记录数据。我只是不知道如何将其作为 shell 脚本的一部分来执行。

答案1

使用 screen 代替 nohup 怎么样?你可以像这样进行后台处理

screen -d -m /bin/bash 'name-of-executable > logfile.out 2>&1'

这比它更好,nohup因为它可以让您了解后台作业的情况。您可以发出命令screen -ls来查看所有作业的列表,然后screen -r screen_identifier直接跳转到该后台作业的交互式 shell。输入man screen以获取更多信息。

答案2

根据评论中的内容,这可能会满足您的要求:

#!/bin/sh

nohup sh -c "sleep 5 && ls /proc/1/fd /proc/$$ >/tmp/log 2>/tmp/log.err" &

echo $$ >>/tmp/pid_log    
wait
echo done

输出看起来像这样:

$ grep . /tmp/log{,.err}
/tmp/log:uid_map
/tmp/log:wchan
/tmp/log.err:ls: cannot open directory /proc/1/fd: Permission denied

相关内容