bash脚本返回空ps结果,CLI上的同一个单行返回正确

时间:2014-03-29 01:30:00

标签: 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 $! | 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。

有什么想法吗?

2 个答案:

答案 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