2010-04-26 55 views
5

這篇文章介紹瞭如何保持一個子進程活着bash腳本:如何在失敗時自動重啓python腳本?

How do I write a bash script to restart a process if it dies?

這調用另一個bash腳本偉大的工作。

不過,我想執行類似的東西在那裏子進程是一個Python腳本,daemon.py它創建它在後臺運行一個派生的子過程:

#!/bin/bash 

PYTHON=/usr/bin/python2.6 

function myprocess { 


$PYTHON daemon.py start 

} 
NOW=$(date +"%b-%d-%y") 

until myprocess; do 
    echo "$NOW Prog crashed. Restarting..." >> error.txt 
    sleep 1 
done 

現在的行爲是完全不同的。看起來python腳本不再是bash腳本的子代,但似乎已經'接管'了BASH腳本PID - 所以不再有BASH包裝器繞過被調用的腳本...爲什麼?

+3

這將有助於瞭解daemon.py中的內容,但是從名稱來看,我猜測它執行的是「exec」或任何python等價物將其置於後臺。 – 2010-04-26 15:08:13

+0

...... W時的T? – 2010-04-26 15:08:42

+0

編輯描述daemon.py – chris 2010-04-26 15:15:24

回答

5

守護進程雙重叉,作爲守護進程本身的關鍵點 - 所以父進程擁有的PID沒有任何價值(它在子進程啓動後很快消失)。

因此,守護進程應該將自己的PID寫入「知名位置」的文件中,按照慣例,父進程知道從哪裏讀取;使用這種(傳統的)方法,如果父進程想要​​作爲重啓看門狗,可以簡單地從知名位置讀取守護進程的PID,並定期檢查守護進程是否仍然存在,並在需要時重啓它。當然,(一個「陳舊」的PID會停留在「知名位置」文件中一段時間​​,並且父代必須考慮這一點),並且可能會有變種(守護進程可以發出「心跳」,以便父母不僅可以檢測死亡守護進程,還可以檢測出「永久停滯」的死亡守護進程,例如由於死鎖,因爲他們停止發送「心跳」[[通過UDP廣播等] ] - 等等),但這是一般的想法。

0

看來,這種行爲是完全不同的,因爲這裏你的「daemon.py」作爲守護進程在後臺啓動。

在另一個指向被調查進程的鏈接是而不是守護進程,它不會在後臺啓動。發射器只是永遠等待子進程停止。

有幾種方法可以解決這個問題。經典的是@Alex解釋的方式,在傳統的地方使用一些pid文件。

另一種方式可能是建立看門狗運行中的進程內,守護進程監視......這將模擬一個正確的過程,不要隨意(這是不應該發生的)打破...

3

你應該看看Python增強建議3143(PEP)here。在這本書中,建議在Python標準庫中包含一個守護進程庫。他瀏覽了很多關於守護進程的很好的信息,並且非常容易閱讀。參考實施是here

+0

感謝參考保羅。看起來很有用。 – chris 2010-04-26 16:54:46

-1

利用'https://github.com/ut0mt8/simple-ha'。

簡單公頃

累的keepalived,corosync,心臟起搏器,心跳或什麼的?這裏有一個簡單的守護進程,它可以確保兩臺主機之間的心跳。一個是活動的,另一個是備份,在更改狀態時啓動腳本。簡單的實施,KISS。生產準備好了(至少它適用於我:)

生活會太容易了!

+1

雖然這可能在理論上回答這個問題,但[這將是更可取的](// meta.stackoverflow.com/q/8259)在此包含答案的基本部分,並提供供參考的鏈接。 – 2016-11-12 07:09:46

+0

謝謝指出。我會盡力更新這個儘快。 – 2016-11-12 08:30:03