我想在后台运行我的脚本然后编写它的pid文件。我正在使用nohup这样做。
这就是我想出来的,
nohup ./myprogram.sh > /dev/null 2>&1 & && echo $! > run.pid
但这会产生语法错误。
以下不会给出语法错误,但问题是echo $!因为nohup在子shell中运行,所以没有写出正确的pid
(nohup ./myprogram.sh > /dev/null 2>&1 &) && echo $! > run.pid
任何解决方案,鉴于我想要一个单行声明来实现这个目标吗?
答案 0 :(得分:90)
重定向后,您已经有一个&符,它将您的脚本放在后台。因此,您只需在该&符号后键入所需的命令,而不是以其他任何方式作为前缀:
nohup ./myprogram.sh > /dev/null 2>&1 & echo $! > run.pid
答案 1 :(得分:18)
这应该有效:
nohup ./myprogram.sh > /dev/null 2>&1 &
echo $! > run.pid
答案 2 :(得分:1)
格里戈尔的答案是正确的,但并不完整。 直接从nohup命令获取pid不同于获取自己进程的pid。
运行ps -ef
:
root 31885 27974 0 12:36 pts/2 00:00:00 sudo nohup ./myprogram.sh
root 31886 31885 25 12:36 pts/2 00:01:39 /path/to/myprogram.sh
要获取自己的进程的pid,可以使用:
nohup ./myprogram.sh > /dev/null 2>&1 & echo $! > run.pid
# allow for a moment to pass
cat run.pid | pgrep -P $!
请注意,如果您尝试在nohup之后立即运行第二个命令,则子进程将不存在。