2009-05-26 75 views
0

請考慮以下情況: - 我正在使用Linux。 我懷疑我的應用程序崩潰了。 我沒有啓用核心轉儲。 日誌中沒有信息。如何知道進程是否已在Linux中啓動但崩潰

我該如何確定系統重新啓動後我的應用程序已啓動,但現在沒有運行,因爲它已經崩潰。

我的應用程序被配置爲服務,用C/C++編寫。

在某種程度上:如何獲取自系統啓動以來執行的所有進程/服務名稱?它甚至有可能嗎?

我知道,我可以啓用日誌記錄並重新啓動過程以獲取崩潰。

回答

5

標準實踐是爲守護進程(/var/run/$NAME.pid)提供一個pid文件,您可以在其中找到其進程ID,而無需手動解析進程樹。然後,您可以檢查該進程的狀態,或者讓守護進程響應某個信號(通常爲SIGHUP)並報告其狀態。確保這個PID仍然屬於你的進程是一個好主意,最簡單的方法是檢查/ proc/$ PID/cmdline。

附錄: 如果你只使用新的Fedora或Ubuntu,你的初始化系統可以upstart,其中有監控和內置觸發功能

正如@ EMG-2指出,BSD進程記帳是可用的,但我認爲這不是這種情況的正確方法。

+0

還請記住進程標識已經過期,因此在檢查活動PID時確保它確實在運行。要做到這一點的一種方法是看看/ proc/PID/cmdline – 2009-05-26 15:32:20

+0

好點Brian - 我假設一定程度的安全編程實踐;)爲了徹底,我會加上它。 – JimB 2009-05-26 15:39:39

1

您可能會做一個誘餌,即應用程序或shell腳本只是真正的應用程序的包裝,但會添加一些類似「應用程序啓動」的日誌記錄。 然後,您更改您的原始應用程序的名稱,並將原始名稱提供給您的誘餌。

0

我不知道獲取所有已執行的進程名稱的標準方式;可能有一種方法可以與SystemTap做到這一點。

如果你只是想監視你的進程,我會建議在fork之後使用waitid(man 2 wait)而不是分離和守護進程。

2

我建議你寫下這樣一個事實,即你開始使用某種日誌文件,這個日誌文件可以是每個啓動時覆蓋的私有日誌文件,也可以是通過syslogd覆蓋的日誌文件。

此外,您可以記錄時間戳心跳,以便確切知道它何時崩潰。

1

正如JimB所提到的,您有守護進程寫入一個PID文件。您可以通過kill(2)系統調用或kill(1)程序向其發送信號0來判斷它是否正在運行。返回狀態將告訴您是否存在具有該PID的進程。

1

守護進程應該總是: 1)使用getpid()(man getpid)或您的語言的等效命令將當前正在運行的實例的進程寫入/var/run/$NAME.pid。 2)將標準日誌文件寫入/ var/log/$ NAME。日誌(更大的日誌文件應該分解爲.0.log,當前正在運行的日誌以及其他日誌的.X.log.gz,其中X是最近的較低的數字) 3)/應該/具有LSB兼容性運行腳本至少接受啓動停止狀態並重新啓動標誌。狀態可以用來檢查守護進程是否正在運行。

0

如果您的應用程序崩潰了,那麼與「您的應用程序從未啓動」無法區分,除非您的應用程序在系統日誌中寫入。 syslog(3)是你的朋友。

要找到你的應用程序,你可以嘗試一些想法:

  • 照照/proc文件系統
  • 運行ps命令
  • 嘗試killall appname -0並檢查返回代碼
相關問題