我有一个类似于以下内容的 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