簡體   English   中英

在 Ubuntu 中重新啟動崩潰的 Python 腳本?

[英]Restart Crashed Python Script in Ubuntu?

我最近一直在使用 AWS 的免費 Web 服務,通過 EC2 在雲中運行 python 腳本。 我將它設置為每天使用 Crontab 在特定時間開始運行,然后全天運行,直到它重新啟動。

我遇到的問題是程序很可能會崩潰。 我在程序上有一堆錯誤捕獲塊,但它們並不總是能阻止崩潰。 在它崩潰的情況下,我真正想要的是它重新啟動並重新上線,這樣我就可以盡可能少地錯過。 但我不知道該怎么做。

我想過包括一堆 Crontab 實例來全天運行它,但這不會只是創建我的腳本的一堆實例嗎? 是否有某種方法可以將其配置為僅在腳本當前未運行時才起作用?

如果它打算一直運行,並且您有 sudo 訪問權限,那么 systemd 可以為您執行此操作。 它給您的設置增加了一些復雜性,但這是它的理想用例。

這是一個示例my_python.service文件:

[Unit]
Description=My Python Service

[Service]
Type=simple
WorkingDirectory=/where/it/runs/from
ExecStart=/usr/bin/python /path/to/script.py
User=notroot
Group=notroot
Restart=always

[Install]
WantedBy=multi-user.target

並非所有這些選項都是必需的,但這將滿足您的需求,並且將通過journalctl -u my_python提供日志記錄。

一一經過:

  • Description= - 僅是為了您的理智並使其更具自我記錄性
  • [Service] - 描述 systemd 應該如何運行和控制進程的塊
  • Type= - 這是分叉、套接字還是 systemd 應該期望的執行行為。 9/10 這只是Simple
    WorkingDirectory= -(可選)只是指定程序應該從哪里運行。 如果您依賴文件輸入或生成文件輸出,那么這將非常有幫助
  • StartExec= - 要運行的實際命令。 它就像從終端運行它一樣,除了它需要絕對路徑,因此是完整的 /usr/bin/python。 您可能想要運行which python以確保路徑正確
  • User=/Group= - 這可以防止它以 root 身份運行,這是一個很好的做法
  • Restart=always - 如果我的程序停止運行,我應該什么時候重新啟動它? 這是您想要的神奇部分,它將讓systemd為您監控進程,並在失敗時自動嘗試重新啟動它。 如果它不能再次啟動,它會繼續嘗試,但會在systemctl status my_python記錄嘗試

最后兩行是為了讓它在啟動的最后階段運行,你並不真正需要它們,但它很好。 當您希望在操作系統啟動期間啟動東西時,它可以幫助您。

獲得此文件后,將其放入systemd的單元目錄(​​對於 yum 系統為/usr/lib/systemd/system )並運行以下命令:

  • systemctl daemon-reload - 在單元目錄中查找新文件和文件更改
  • systemctl enable my_python - 或者任何你命名的服務,這使得程序在啟動時運行
  • systemctl start my_python - 這實際上運行您的程序並為您監視它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM