如何編寫 bash 指令碼以在程序凍結時重新啟動程序

Mondo 科技 更新 2024-02-29

問:

我有乙個 python 指令碼,它將檢查佇列並對每個元素執行操作:

# checkqueue.py

while true:

check_queue()

do_something()

如何編寫 bash 指令碼來檢查它是否正在執行,如果沒有,請啟動它。 大致如下:偽**(或者它應該做類似 ps |。grep的事情? )

# keepalivescript.sh

if processidfile exists:

if processid is running:

exit, all ok

run checkqueue.py

write processid to processidfile

我將從 crontab 呼叫它
# crontab

5 * /path/to/keepalivescript.sh

乙個:避免使用 pid 檔案、cron 或任何其他試圖評估不屬於其子程序的程序。

在 Unix 中,等待子程序是有充分理由的。 任何試圖解決這個問題的方法(ps 解析、pgrep、儲存 pid 等)都是有缺陷的,並且存在漏洞。 稍後分析。

假設您的程序名為 proca,程序監控名為 procb,您需要 procb 作為 proca 的父程序。 因為只有啟動流程的流程才能可靠地等待它結束。 這在 bash 中很容易實現。

until proca; do

echo "proca crashed with exit code $?restart..." >&2

sleep 1

done

上面的 bash 在 until 迴圈中執行 proca。 第一行開始 proca 並等待它結束。 當它結束時,直到檢查其退出狀態。 如果退出狀態為 0,則表示它正常結束(這意味著您要求它以某種方式關閉,並且它成功關閉)。 在這種情況下,我們不想重新啟動它(我們只是要求它關閉! 如果退出狀態不是 0,則迴圈體將執行,這會在 stderr 上發出錯誤訊息,並在 1 秒後重新啟動迴圈(返回第 1 行)。

我們為什麼要等一會兒? 因為如果 Proca 的啟動順序出現問題並立即崩潰,您將獲得乙個非常密集的不斷重啟和崩潰的迴圈。 睡眠 1 消除了這種壓力。

然後需要做的就是啟動這個 bash 指令碼,它將監控 proca 並在必要時重新啟動它。 如果你想在引導時啟動監控指令碼(作業系統),你可以用@reboot規則在使用者的 cron(1) 中排程它。 使用 crontab -e 命令開啟 cron 規則並新增規則以啟動監視指令碼:

@reboot /usr/local/bin/procamonitor

至於不使用pid檔案的原因:

1.PID 重用(這可能導致殺死錯誤的程序)。

2.PID 檔案已過時。 您需要過於複雜的邏輯來檢查 pid 檔案是否過時,並且任何此類邏輯在 1 中都存在相同的缺陷。

3.如果您甚至沒有寫入許可權或處於唯讀環境中,該怎麼辦?

或者,檢視 systemdunit(5)。您可以將名為 proca. 的檔案新增到 lib systemd 系統目錄服務,讓 systemd 程序監控您的 proca。

[unit]

description=daemon for proca.

service]

execstart=/path/to/proca

restart=on-failure

restartsec=1s

install]

wantedby=multi-user.target

然後執行以下命令:
systemctl daemon-reload

systemctl enable proca.service

參考:stackoverflow 問題 696839

man systemd.unit

man systemctl

相關閱讀:SH 和 Bash 的區別。

2>&1 在 shell 中是什麼意思。

在 bash 中,是否更推薦使用雙括號而不是單方括號。

如何檢查是否在 bash 中設定了變數。

相關問題答案

    Python 指令碼提示:如何編寫有效的命令列工具

    幫助計畫 介紹 嗨,python程式設計的傢伙們!今天我們要講乙個實用的話題 如何編寫乙個有效的python命令列工具。您是否曾經有過快速處理某些資料或自動執行某些任務的經驗,但不知道從哪裡開始?別擔心,其餘內容將為您揭開 Python 指令碼的神秘面紗。首先,我們需要明確自己的需求。乙個好的命令列...

    如何在Python中高效編寫程式碼?Python實用程式設計技巧分享!

    Python 是一種高效 易學且功能強大的程式語言,具有許多實用的程式設計技巧,可以幫助開發人員更高效地編寫。以下是一些實用的 Python 程式設計技巧的細分和示例 .列表推導式 列表推理是一種在 Python 中建立和操作列表的簡潔 易於閱讀的方法。它可以使 更簡潔,減少冗餘。例如,將列表中的所...

    古代家譜是如何寫成的

    家譜是一本記載家族成員的歷史書,充滿神秘感,讓我們來探究一下古代家譜是如何寫成的。在古代,家譜一般由家族長輩或專門修改家譜的人撰寫。他們會首先收集家庭成員的資訊,包括姓名 生卒日期 成就 事蹟等,然後將它們彙編成冊。在組織過程中,他們也會根據家族的傳承和歷史,新增一些特殊的符號和標記,以突出家族的歷...

    如何用巧妙的押韻寫一首山歌

    大家好,今天想和大家分享一種美妙而獨特的民間藝術形式 創作山歌。這種古老的藝術形式,就像民間藝術中的雜技一樣,既需要技巧,也需要情感投入。讓我們仔細看看它的魅力吧!首先,讓我們談談押韻。韻律是山歌中不可缺少的一部分,它使每一句話的最後乙個字和諧地迴響,形成鮮明的節奏感。押韻主要有三種方式 單句押韻,...

    如何寫家譜是正確的?

    家譜是記載家族歷史 傳承家族文化的重要文獻,一本線條清晰 內容正確的家譜,對家族的凝聚和傳承具有重要意義。那麼,如何才能寫出好的家譜呢?.確定寫作目的。在你開始寫你的家譜之前,你必須首先明確寫作的目的。是記錄家族史,傳承家族文化,還是紀念家族成員,彰顯家族榮耀等。明確寫作目的有助於確定家譜的內容和風...