2014-09-27 65 views
2

我試圖一直運行一個簡單的Python腳本。我希望它在啓動時自動啓動,並能夠從故障中恢復。也就是說,如果發生導致腳本停止的故障,我並不在乎,只是希望它再次開始運行。如果整個設備重新啓動,我很好。如何讓腳本始終在linux中運行?

我剛剛測試了一個工作腳本using init.d,但不知道如何從故障中恢復?有一個cronjob檢查一個pid的存在嗎?

我也想檢查完整性。也就是說,我想確保腳本不會被其他進程意外修改。我聽說過使用已知的值檢查腳本的CRC32,但不知道如何在正在執行的文件上獲得任何類型的md5。

這是一個超級簡單的Python腳本順便說一句(一個文件,~20lines)。我不確定這是否真的改變了一切。

+0

請參閱[看門狗定時器](http://en.wikipedia.org/wiki/Watchdog_timer)。如果程序本身是可靠編寫的,程序本身不應該死亡,但如果程序死亡,自動化系統就會報告和/或重新啓動它。如果它能夠恢復是另一回事,並取決於它如何終止以及數據/操作已經存在的狀態以及任何潛在的保證或缺乏。爲了防止修改,只需拿走訪問權限。 – user2864740 2014-09-27 04:25:26

+0

[Ghost](https://ghost.org)的博客使用[supervisord](http://supervisord.org/)觀看並重新啓動可能失敗的進程。 – Paul 2014-09-27 04:29:48

+1

類似於:http://stackoverflow.com/questions/10922754/python-watchdog-for-another-python-process-technique/10922938#10922938 – Paul 2014-09-27 04:33:53

回答

2

Ghost blogging platform installation instructions [許可證:CC-BY-3.0]有說明如何使用supervisord部署腳本的NodeJS(運行的博客),這樣,當它失敗並重新啓動系統將重啓的部分。

主管(http://supervisord.org/)受歡迎Linux發行版 - 例如 如Fedora的,Debian和Ubuntu的保持主管的軟件包:甲 過程控制系統,它允許你不使用初始化腳本在啓動時運行 幽靈。與初始化腳本不同,Supervisor在Linux發行版和版本之間可移植爲 。

按照Linux發行版的要求安裝Supervisor。通常情況下, 這將是:

於Debian/Ubuntu:apt-get的安裝監

的Fedora:百勝安裝主管

大多數其他發行版:easy_install的主管

確保主管正在運行,運行 service supervisor start 爲您的Ghost安裝創建啓動腳本。使用超級

[program:ghost] 
command = node /path/to/ghost/index.js 
directory = /path/to/ghost 
user = ghost 
autostart = true 
autorestart = true 
stdout_logfile = /var/log/supervisor/ghost.log 
stderr_logfile = /var/log/supervisor/ghost_err.log 
environment = NODE_ENV="production" 

開始鬼:通常,這會 在 /etc/supervisor/conf.d/ghost.conf 例如supervisorctl啓動鬼

要停止鬼:supervisorctl停止鬼

OK,所以如果您的腳本被稱爲myscript.py並且它屬於用戶並住在/home/snake

然後命令python /home/snake/myscript.py,該目錄應該是,無論你想運行這個(我們假設這是/home/snake),該用戶應適當設置(我們假設您想要以用戶運行),自動保持不變,日誌文件應該重命名。

環境設置腳本所需的任何ENV變量。通常情況下,除非您正在使用它們來控制腳本的各個方面,否則不需要它。

  1. 安裝supervisord如上,但不設置任何東西鬼
  2. 相反,創建/etc/supervisor/conf.d/myscript如下:
  3. supervisorctl開始的MyScript

/etc/supervisor/conf.d/myscript

[program:myscript] 
command = python /home/snake/myscript.py 
directory = /home/snake 
user = snake 
autostart = true 
autorestart = true 
stdout_logfile = /var/log/supervisor/myscript.log 
stderr_logfile = /var/log/supervisor/myscript_err.log 

應該正在運行,並且即使在重新啓動時也會重新啓動。

關於您的安全問題,這是有問題的。如果您認爲攻擊者具有對包含該腳本的文件系統的讀/寫訪問權限,則他們還可以更改安全哈希。公鑰簽名更好一些,因爲攻擊者不知道如何改變簽名,因爲他缺少私鑰。但是再一次,攻擊者可能會簡單地重寫測試簽名的代碼並繞過它,或者替換腳本以驗證後運行腳本,以便始終運行其他命令。