Linux
我有一個應該無限期執行的 perl 腳本。它正在被殺死…我如何確定是誰或什麼殺死了它?
我在螢幕上執行 perl 腳本(我可以登錄並檢查調試輸出)。腳本邏輯中的任何內容都不應該將它殺死得這麼死。
我是僅有的兩個可以訪問伺服器的人之一,另一個人發誓不是他(而且我們都有相當多的錢可以繼續順利執行)。我沒有理由相信某些黑客已經設法獲得了外殼或類似的東西。我幾乎沒有理由懷疑主機操作的管理員(頻寬/cpu 方面,這個腳本非常輕量級)。
螢幕繼續執行,但在 perl 腳本的輸出結束時,我看到“Killed”並且它已退回到提示符。我該如何去測試是什麼在敲打該死的東西?
我檢查了 crontab,裡面沒有任何東西會殺死隨機/非隨機程序。任何日誌文件中都沒有給出任何提示。看起來它會執行 2 到 8 小時(在我家裡的 mac 上,它會執行超過 24 小時而沒有問題)。伺服器正在執行 Ubuntu 版本或其他版本,如果重要,我可以查一下。
在沒有太多實際知識的情況下,如果 OOM 殺手正在執行,我將開始查看 dmesg 輸出或各種系統日誌。如果是這樣,大概就是這樣。
為所有信號(TERM、SEGV、INT、HUP 等)放入信號處理程序,並在遇到它們時讓它們註銷。它不會告訴你是什麼在發送信號,但它會讓你看到它是什麼信號,甚至可以忽略它。
$SIG{'TERM'} = $SIG{'INT'} = sub { print(STDERR "Caught SIG$_[0]. Ignoring\n"); };
當它擷取到一個 sigterm 或 sigint 時會列印出來,然後將控制權返回給程序。當然,在所有這些信號都被忽略的情況下,殺死它的唯一方法是讓程序本身退出,或者向它發送一個無法擷取的 SIGKILL。