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

q0qdq0h2  于 2023-04-29  发布在  Linux
关注(0)|答案(4)|浏览(94)

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

如果我想要一个单行语句来实现这一点,有什么解决方案吗?

cedebl8k

cedebl8k1#

在重定向后已经有了一个&符号,它将脚本置于后台。因此,您只需要在与号之后键入所需的命令,而不需要以任何其他内容作为前缀:

nohup ./myprogram.sh > /dev/null 2>&1 & echo $! > run.pid
sg3maiej

sg3maiej2#

这应该可以工作:

nohup ./myprogram.sh > /dev/null 2>&1 &
echo $! > run.pid
jtoj6r0c

jtoj6r0c3#

格里戈尔的回答是正确的,但不完整。直接从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之后立即运行第二个命令,则子进程还不存在。

rqqzpn5f

rqqzpn5f4#

也可以使用Python:

nohup python run_experiment.py > experiment.log & echo $! > experiment.nohup.pid

相关问题