Unix

為什麼這個過程拒絕退出?

  • March 9, 2016

我有一個 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查看它的內容,它會提供更多資訊。

引用自:https://serverfault.com/questions/762610