[英]bash script returns empty ps results, same one-liner on CLI returns correctly
我有一個運行此命令的bash初始化腳本:
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。
有任何想法嗎?
第二次使用
$!
您實際上使用了回波的pid。
將其保存在變量中以備后用。
上面的陳述是不正確的,就像@ mklement0指出的$!
僅在啟動新的后台進程時更新。
因此,最可能的問題是時間安排:在腳本檢查pid時,可能尚未對子進程進行分叉。
感謝所有參與其中的人! 答案的確是增加睡眠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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.