2012-11-19 138 views
3

我寫在Linux上,需要我捉系統事件,如應用程序:捕獲系統事件

  1. 系統重新啓動
  2. 用戶「XYZ」的日誌在
  3. 「XYZ」的應用程序崩潰等

,並需要執行基於某些功能。對於例如爲:

  1. 運行備份腳本
  2. 運行恢復程序等

誰能告訴我如何捕捉系統事件在C/Linux呢?

P.S:我不是在談論「文件系統」的事件在這裏:P

+0

對於第一個做的「運行級別」谷歌搜索。 –

+0

您可以註冊一個函數,使用'register_reboot_notifier'在重新啓動時調用。 – Felix

回答

4

沒有「系統事件」的概念。你需要指定你需要處理,並實施適當的機制來處理每一個事件:

  • 系統啓動:該init進程啓動時調用從/etc/init.d腳本。確切的基礎設施在分佈之間略有不同,但Linux Standards BaseSystem Initialization通常應該可以工作。

  • 用戶登錄/註銷:該LSB還定義接口向Pluggable Authentication Modules庫。您可以實現一個在登錄期間將被調用的共享庫(以及需要身份驗證和授權的其他操作)。取決於你想要做什麼,可能已經有一個模塊可以爲你工作,所以你可以先試着找它。無論哪種情況,我都不認爲安裝它的方式與分發無關,甚至在給定的發行版中,您必須考慮管理員可能已經進行了自定義修改,因此安裝需要管理員進行手動干預。

  • 應用程序崩潰:您將不得不儀器它。

+0

感謝您的回覆。 Okey,Linux中沒有像** inotify()**那樣的東西,它監聽系統事件並通知應用程序? – openstk

+1

@Shrirang:正如我所說,首先沒有系統事件的概念。像任何其他的Unix一樣,GNU/Linux是由大多數獨立的組件構建而成的。一個負責初始化,認證和授權之一,圖形用戶界面之一等。每個可以單獨更換,甚至有時可以更換。例如。 PAM庫統一身份驗證比Linux內核年輕得多。雖然SysV Init比較老,但在某些發行版中它現在被[upstart](http://upstart.ubuntu.com/)取代(幸運的是支持init腳本)。 –

4

我認爲你應該考慮閱讀系統日誌 - 你詢問的所有內容都記錄到系統日誌(對於標準配置)。如果您的系統使用syslog-ng,那麼您甚至可以將其配置爲直接寫入您的程序,有關詳細信息,請參見http://www.syslog.org/syslog-ng/v2/#id2536904。但即使使用其他syslog守護進程,您也可以始終從/ var/log讀取文件(或文件),就像tail -f一樣,最終對特定消息作出反應。

我不知道應對應用程序崩潰 - 有一個內核選項可以記錄用戶進程中的每個SIGSEGV,但AFAIK它只能在ARM架構上使用 - 最後的方法是檢測應用程序(如Jan Hudec指出的那樣)將某些內容記錄到系統日誌中。

+0

感謝您的回覆。我想讀系統日誌會有巨大的性能開銷。每一分鐘我們都要處理數百條線路:P但是我也會用任何方式評估這個解決方案 – openstk

+2

@Shrirang:其實這是一個不錯的選擇。 syslog守護進程非常靈活,因此您可以告訴它將您感興趣的特定事件的日誌寫入單獨的位置,甚至可以通過管道或套接字將它們發送給您。但是,您仍然只能對事後做出反應,所以根據您想要做的事情,它可能會也可能不合適。當然,你仍然需要從init腳本啓動。 –

+2

性能不應該是一個大問題,我正在處理一個使用perl腳本處理syslog條目的項目,我們可以輕鬆處理每秒幾十萬行。如果您正確配置syslog - 只獲取您真正感興趣的內容 - 性能應該沒問題。 – kompas