Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux bash脚本返回空的ps结果,CLI上的同一行程序正确返回_Linux_Bash_Shell - Fatal编程技术网

Linux bash脚本返回空的ps结果,CLI上的同一行程序正确返回

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

我有一个运行以下命令的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、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)