2010-03-01 87 views
4

有沒有一種方法可以監視進程,如果它死了,是否可以調用腳本,這又會使進程恢復備份?監視進程

+1

你可能會得到更好的答案在這serverpen.com – Gabe 2010-03-01 05:19:55

+0

https://serverfault.com/questions/637470/monitor-a-process-using-monit-in-ubuntu – quadruplebucky 2017-07-06 20:53:33

+0

而不是把一個問題「擱置爲脫離主題「,爲什麼不把它移動到它所屬的超級用戶或服務器故障? – 2017-07-07 21:26:36

回答

1

我之前寫過一個叫做relight的人。還有更強大的解決方案,但這個很簡單,適用於我。

2
+1

謝謝:)看起來它對我來說是完美的。 – 2010-03-01 06:36:03

+0

monit不會爲一段時間內的過程提供圖表/統計數據嗎? – 2013-05-06 04:56:37

+0

只是一個指針。 mmonit附帶AGPL許可證 – madhairsilence 2017-05-22 06:33:32

6
#!/bin/bash 
while true 
do 
    if pgrep myprocess >/dev/null ;then 
    echo "up" 
    else 
    echo "down" 
    /path/to/myprocess & 
    fi 
    sleep 60 
done 

,或者你可以刪除while循環和睡眠,並把腳本設置爲每分鐘運行

1

做最簡單的事情cron作業是擁有初始父做監控。 EG,

 
#!/bin/sh 

while true; do 
    cmd 
    # When you get here the process has died. start 
    # the loop again and restart it 
done 

這個腳本是容易被殺死,所以你可能要 捕獲信號,但同樣將是你可以寫任何 顯示器也是如此。如果cmd立即終止 ,或者添加一些日誌記錄(在調用cmd之後調用日誌記錄器 ),您可能會想要插入延遲 。沒有必要變得花俏。

0

如果你使用的是SysV系統(不是Upstart),你可以把這個進程重新生成到inittab。

只需編輯/ etc/inittab文件,並添加這樣一行:

PROC:12345:重生:/路徑/到/過程

0

有中得到完成任務的方法數:

  1. 正如其他人所建議的 - 運行腳本來檢查進程是否正在運行,如果沒有運行,請重新啓動進程。要檢查你,如果進程正在運行與否,你可以使用pgrep <process name> | wc -l
  2. 使用watch command一定的時間間隔後運行一個腳本來檢查,如果進程正在運行,如果沒有則重新啓動該進程
  3. 創建一個父過程中,總是會對於子進程,如果子進程崩潰或停止,則會通知父進程,然後重新啓動新進程。
0

systemd是大多數主要Linux發行版中的高級流程管理器。

-1

使用在簡單的configuration file中指定的commandSupervisor可以啓動,監視和重新啓動意外死亡的進程。

考慮/etc/supervisor/conf.d/forever.conf以下主管配置文件片段,其顯示的日期和時間每秒:forever與PID 15474開始

[program:forever] 
command=/bin/bash -c 'while true; do echo "Current time is `date`"; sleep 1; done;' 

程序:

[email protected]:~/Projects/fire$ sudo supervisorctl status forever 
forever       RUNNING pid 15474, uptime 0:00:17 
[email protected]:~/Projects/fire$ sudo supervisorctl tail forever 
Current time is Fri Jul 7 17:11:10 EDT 2017 
Current time is Fri Jul 7 17:11:11 EDT 2017 
Current time is Fri Jul 7 17:11:12 EDT 2017 
Current time is Fri Jul 7 17:11:13 EDT 2017 
Current time is Fri Jul 7 17:11:14 EDT 2017 
Current time is Fri Jul 7 17:11:15 EDT 2017 
Current time is Fri Jul 7 17:11:16 EDT 2017 
Current time is Fri Jul 7 17:11:17 EDT 2017 
Current time is Fri Jul 7 17:11:18 EDT 2017 
Current time is Fri Jul 7 17:11:19 EDT 2017 
Current time is Fri Jul 7 17:11:20 EDT 2017 
Current time is Fri Jul 7 17:11:21 EDT 2017 
Current time is Fri Jul 7 17:11:22 EDT 2017 
Current time is Fri Jul 7 17:11:23 EDT 2017 
Current time is Fri Jul 7 17:11:24 EDT 2017 
Current time is Fri Jul 7 17:11:25 EDT 2017 

殺死forever過程和主管重新啓動它會自動使用新的進程ID 15760:

[email protected]:~/Projects/fire$ sudo kill 15474 
[email protected]:~/Projects/fire$ sudo supervisorctl status forever 
forever       RUNNING pid 15760, uptime 0:00:02 
[email protected]:~/Projects/fire$ sudo supervisorctl tail forever 
Current time is Fri Jul 7 17:11:21 EDT 2017 
Current time is Fri Jul 7 17:11:22 EDT 2017 
Current time is Fri Jul 7 17:11:23 EDT 2017 
Current time is Fri Jul 7 17:11:24 EDT 2017 
Current time is Fri Jul 7 17:11:25 EDT 2017 
Current time is Fri Jul 7 17:11:26 EDT 2017 
Current time is Fri Jul 7 17:11:27 EDT 2017 
Current time is Fri Jul 7 17:11:28 EDT 2017 
Current time is Fri Jul 7 17:11:29 EDT 2017 
Current time is Fri Jul 7 17:11:30 EDT 2017 
Current time is Fri Jul 7 17:11:31 EDT 2017 
Current time is Fri Jul 7 17:11:32 EDT 2017 
Current time is Fri Jul 7 17:11:33 EDT 2017 
Current time is Fri Jul 7 17:11:34 EDT 2017 
Current time is Fri Jul 7 17:11:35 EDT 2017 
Current time is Fri Jul 7 17:11:36 EDT 2017 
+0

歡迎您提供解決方案的鏈接,但請確保您的答案在沒有它的情況下很有用:[在鏈接附近添加上下文](// meta.stackexchange.com/a/8259),以便您的同行用戶擁有一些想法是什麼以及它爲什麼在那裏,然後引用您鏈接到的頁面中最相關的部分,以防目標頁面不可用。 [答案只是一個鏈接可能會被刪除。](// stackoverflow.com/help/deleted-answers) – 2017-07-06 20:25:26

+0

ps,對於自動評論感到抱歉,但它是一個非常簡單的鏈接回答,我不是確定問題可以被關閉(請求鏈接)。 – 2017-07-06 20:26:03

+0

我擴大了我的答案。我現在認爲這是總體上最好的答案之一。然而,即使在最初的形式下,我的回答也不比推薦Monit的內容更少(參見stackoverflow.com/a/2354030/107158)。 – 2017-07-07 21:23:50