如何运行nohup并在单个bash语句中编写其pid文件

时间:2013-11-27 22:19:04

标签: linux bash

我想在后台运行我的脚本然后编写它的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 

任何解决方案,鉴于我想要一个单行声明来实现这个目标吗?

3 个答案:

答案 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之后立即运行第二个命令,则子进程将不存在。