2010-09-07 164 views
16

Linux中是否有任何命令可以通過它來知道進程是否處於掛起狀態。如何檢查進程是否處於掛起狀態(Linux)

+5

這是一個superuser.com問題。 – rsilva4 2010-09-07 13:32:55

+0

@ rsilva4或者是一個unix one – OverCoder 2015-08-13 12:43:03

+1

'strace -p $ process_id' - 如果沒有連續的輸出,那意味着它正在等待某件事。如果等待時間過長,您可以考慮「掛斷」。 – 2016-09-16 13:29:17

回答

5

'hang state'是什麼意思?通常,無響應並使用100%CPU的進程陷入無限循環。但是there's no way可以確定是否發生了這種情況,或者進程是否最終可能達不到循環退出狀態並繼續運行。

通過嚮應用程序的事件循環發送消息並查看是否有任何響應,桌面掛起檢測器正常工作。如果沒有一定的時間,他們認爲應用程序已經「掛起」......但完全有可能只是在做一些複雜的事情,一旦完成就會立即恢復。無論如何,這不是你可以用於任何任意進程的東西。

1

不幸的是,一個過程沒有掛起狀態。現在可能會陷入僵局。這是塊狀態。進程中的線程被阻塞。其他的事情可能是進程正在運行的活鎖,但一次又一次地做同樣的事情。此過程處於運行狀態。所以你可以看到沒有明確的掛起狀態。 建議您可以使用top命令查看進程是否使用100%CPU或內存。

19

在Linux中是否有任何命令可以通過它知道進程是否處於掛起狀態。

沒有命令,但一旦我不得不做一個非常愚蠢的黑客來完成類似的東西。我寫了一個Perl腳本,定期(在我的情況下,每30秒):

  • 運行ps找到觀看過程中的PID的列表(連同EXEC時間等)
  • 環比的PID
  • 開始gdb使用其PID附着到過程中,採用從thread apply all where它傾倒堆棧跟蹤,從進程分離
  • 一個過程被宣佈上吊如果:
    • 其堆棧跟蹤並沒有改變,時間3個後檢查沒有改變
    • 它的堆棧跟蹤並沒有改變,時間顯示100%的CPU負荷後3個檢查
  • 上吊進程已被給予機會一個監視應用程序重新啓動掛起的實例。

但是,這是非常非常非常非常粗劈,做達成關於將要錯過最後期限,這是天數後取出,終於安裝了越野車的應用程序修復之後。如果所有其他響應者都絕對正確地評論過,則無法找到該過程是否被吊死:僅僅因爲掛起可能以多種原因發生,而且往往與應用程序邏輯綁定。

唯一的方法是應用程序本身能夠指示它是否存在或不存在。最簡單的方法可能是例如定期的日誌消息「我還活着」。

+0

雖然每個人都很快就會引用暫停問題,但我喜歡您的響應是以工程爲導向的。儘管我們無法確定任意算術處理過程X **是否會在完成處理之前完成處理,但是我們可以對我們所知道的處理進行限制。解決底層問題最好,但是殺死和重啓一個進程並不像你發現的那樣骯髒:) – Indolering 2013-03-18 13:53:23

15

,你可以檢查文件

/proc/[pid]/task/[thread ids]/status 
相關問題