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

ami*_*kar 43 linux bash

我想在后台运行我的脚本,然后编写它的pid文件.我正在使用nohup这样做.

这就是我提出的,

nohup ./myprogram.sh > /dev/null 2>&1 & && echo $! > run.pid 
Run Code Online (Sandbox Code Playgroud)

但这会产生语法错误.

以下不会给出语法错误,但问题是echo $!因为nohup在子shell中运行,所以不会写出正确的pid

(nohup ./myprogram.sh > /dev/null 2>&1 &) && echo $! > run.pid 
Run Code Online (Sandbox Code Playgroud)

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

Gri*_*fov 94

重定向后,您已经有一个&符号,它将您的脚本放在后台.因此,您只需要在该&符号后键入所需的命令,而不是以其他任何方式作为前缀:

nohup ./myprogram.sh > /dev/null 2>&1 & echo $! > run.pid
Run Code Online (Sandbox Code Playgroud)

  • 尝试了这个,但得到一个pidfile,由于一些奇怪的原因,后面的1个进程落后.所以如果pidfile说123,实际的进程ID是124.任何想法? (3认同)
  • @Allen,因为nohup forks和为实际命令创建的新进程.有时,这可能不是确切的下一个pid,例如在重度分叉其他过程期间. (3认同)
  • `nohup ./run.sh > /dev/null & echo $(($!+1)) > run.pid` (2认同)

anu*_*ava 20

这应该工作:

nohup ./myprogram.sh > /dev/null 2>&1 &
echo $! > run.pid
Run Code Online (Sandbox Code Playgroud)

  • @ amit.codename13:是的,你当然可以像`nohup ./myprogram.sh>/dev/null 2>&1&echo $一样使用它!> run.pid`我只是把它放在2行中,仅用于理解目的. (6认同)
  • 是的,换行是可选的. (3认同)