
我有一個進程 - 一個 perl 腳本 - 可以:
while true
check a POP account on a server on the lan
process any email found
write logs - messages found, actions taken, errors
sleep for 15 seconds
它在 redhat 7.3 伺服器上運行(我繼承了它,我對該機器的年齡不滿意)。 /etc/inittab 已用完,如下所示:
spop:2345:respawn:/usr/local/gw/bin/popdmn
如果它死掉了,init 會重新啟動它。
在過去的幾天裡,該過程將不再有效除非它被追蹤了。當它剛剛運行時,它永遠不會登入 pop 伺服器。一旦它被追蹤(透過「strace -Ff -p cat /usr/local/gw/var/popdmn.pid
」),它就可以完美地工作。
作為解決方法,我在伺服器上運行 screen 並運行 strace。顯然這不太理想。
為什麼一個進程會這樣做?我以前沒見過這種情況發生。
答案1
我想我被一種古老的 strace bug 咬了:
https://bugzilla.redhat.com/show_bug.cgi?id=64303
https://bugzilla.redhat.com/show_bug.cgi?id=75709
這個盒子上有 strace-4.4-4,所以聽起來可能就是那個 bug。聽起來這似乎是我們自己造成的,因為我們在嘗試調試時進行了跟踪 - 並使情況變得更糟。
kill -CONT
努力恢復該過程。
確實是時候升級這個盒子了。
答案2
我認為最大的區別是速度和訊號處理。
關於速度,如果進程是多執行緒的,那麼 strace 將改變時間,這將改變我在競爭條件等方面的行為。或者與協議行為相關的計時資訊。
例子。假設 POP 伺服器已升級,現在更加小心地確保對等方不會一次發送多個 POP 命令。這在 SMTP 伺服器中作為預防垃圾郵件的手段更有用。
您的進程是否觀察到正確的 POP 行為,即在每個 POP 命令之後等待伺服器的回應?或者它是否假設成功或在命令之間等待一段時間。
如果您捕獲通過和失敗情況下的實際協議流量,是否有任何違反協議的跡象?