Unix
為什麼這個過程拒絕退出?
我有一個 cron 作業,它執行一個執行 php 腳本的 shell 腳本。它每天執行,發送一些電子郵件,並寫入標準輸出(重定向到 shell 腳本中的日誌文件)。
看起來這個過程今天已經完成,但沒有退出(或任何正確的術語!)。
$ ps -ejH ... 10756 10756 10756 ? 00:00:00 sh 10760 10756 10756 ? 00:00:00 automail.sh 10766 10756 10756 ? 00:03:57 php ...
具有 id 的程序
10766
消耗了不到 4 分鐘的 CPU 時間。從互動式頂級會話中,我得到以下資訊:10766 root 20 0 40640 6024 4 S 0.0 0.2 3:57.48 php
自從我看過它以來,那些百分之幾都沒有改變。所以我的結論是它正在做……最多幾乎沒有。
$ ls -ld /proc/10766/ dr-xr-xr-x 7 root root 0 2016-03-09 08:55 /proc/10766/
告訴我它已經有一段時間了;伺服器時間現在是:
$ date Wed Mar 9 11:08:29 GMT 2016
php 腳本的最後一行寫入日誌文件,該行存在於日誌文件中。執行 php 腳本是 shell 腳本中的最後一件事。
我該如何診斷為什麼這個過程沒有退出?
更新
這是我正在執行的 shell 腳本的編輯版本:
#!/bin/sh DATE=$(date +%Y-%m-%d) PHP=/usr/bin/php SCRIPT=/path/to/script.php LOG=/path/to/log.file.$DATE.log $PHP $SCRIPT >> $LOG
該程序被列為“睡眠”未完成或殭屍。
10766 root 20 0 40640 6024 4 S 0.0 0.2 3:57.48 php
它卡在做某事,因為你說它有
read(4, ...
一個 strace 輸出我會說它可能正在等待套接字連接的另一端向它發送數據。就像一個網站已經放棄向你發送數據一樣。不過,這只是一個猜測。
幾乎可以肯定應該有一個 4 的文件描述符,如果您嘗試
lsof -p10756
查看它的內容,它會提供更多資訊。