Linux bash脚本返回空的ps结果,CLI上的同一行程序正确返回
我有一个运行以下命令的bash init脚本:Linux bash脚本返回空的ps结果,CLI上的同一行程序正确返回,linux,bash,shell,Linux,Bash,Shell,我有一个运行以下命令的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 $! | ta
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、tail,添加--no标题,甚至一直到只做:
chidlpid=$(ps --no-heading --ppid $!)
它仍然不会返回子pid
有什么想法吗?第二次使用$时代码>实际使用的是回显的pid。将其保存在变量中以供以后使用
正如@mklement0所指出的,$以上的说法是不正确的代码>仅在启动新后台进程时更新
因此,最可能的问题是时间安排:在脚本检查pid时,子进程可能尚未分叉。感谢所有参与帮助的人!答案确实是添加了一个sleep 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
你说失败是什么意思?您以前是否尝试过发出set-x
,以便检查脚本的详细输出?我的意思是,它的子进程空输出与我使用awk的“NR>1”和ps尝试的其他方法完全相同--无标题抱歉,这个东西的格式几乎是不可能的:sudo-umyuser应用程序_ENV=production php script/push-server.php>/var/log/push-server.log 2>&1&
mainpid=$
echo$mainpid>/var/log/push_server.pid
childpid=$(ps--无标题--ppid$mainpid | tail-1 | awk'{print$1}')
echo“pid:$childpid”
echo$childpid>/var/log/push_server.pid
echo-n“push_服务器在pid$!$childpid上启动”
我得到的是:+mainpid=28593+echo 28593+sudo-umyuser应用程序_ENV=production php script/push-server.php++ps--无标题--ppid 28593++tail-1++awk'{print$1}'+childpid=+echo'PID:'
天哪,这里的格式如此不直观!:\这不是答案,而是一个提示:pgrep-P${!}
应该足以返回所需的PID,如果它存在(但是)-假设大于1。您可以使用childpid=$(pgrep-P$mainpid)