進程在 strace 下工作但正常情況下不工作

進程在 strace 下工作但正常情況下不工作

我有一個進程 - 一個 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 命令之後等待伺服器的回應?或者它是否假設成功或在命令之間等待一段時間。

如果您捕獲通過和失敗情況下的實際協議流量,是否有任何違反協議的跡象?

相關內容