簡體   English   中英

bash腳本返回空的ps結果,CLI上的同一單行代碼正確返回

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM