我有一个运行此命令的bash init脚本:
sudo -umyuser APPLICATION_ENV=production php script/push-server.php >> /var/log/push-server.log 2>&1 &
然后我尝试捕获两个pid并将它们放入文件中:
echo $! > /var/log/push_server.pid
childpid=$(ps --no-heading --ppid $! | tail -1 | awk '{ print $1 }')
echo $childpid >> /var/log/push_server.pid
但是,如果我使用--no-heading标志,则返回空白。如果我在命令行上运行相同的ps命令,它将返回正确的pid号。如果我稍微修改命令,也会发生同样的情况:
childpid=$(ps --no-heading --ppid $! | awk '{NR>1}' | tail -1 | awk '{ print $1 }')
我尝试删除NR,尾部,添加--no-header,甚至一直到下去:
chidlpid=$(ps --no-heading --ppid $!)
它仍然不会返回孩子的pid。
有什么想法吗?
答案 0 :(得分:1)
第二次使用 $!
时,实际上使用了回声的pid。将其保存在变量中供以后使用。
上述陈述不正确,因为@ mklement0指出$!
仅在新的后台进程启动时更新。
因此,最可能的问题是时间:在脚本检查pid时,子进程可能尚未分叉。
答案 1 :(得分:0)
感谢所有参与帮助的人!答案确实是增加一个睡眠n:
sudo -umyuser APPLICATION_ENV=production php script/push-server.php >> /var/log/push-server.log 2>&1 &
mainpid=$!
echo $mainpid > /var/log/push_server.pid
sleep 3
childpid=$(ps --no-heading --ppid $mainpid | tail -1 | awk '{ print $1 }')
echo $childpid >> /var/log/push_server.pid
echo -n "push_server started on pid $mainpid $childpid"
return