系統重啟時的 Upstart 實例作業

系統重啟時的 Upstart 實例作業

我正在使用 upstart 實例作業來啟動我的一些服務。這些作業意味著每個使用者都有一個實例,即它們將使用者名稱作為實例參數。我還將它們配置為由暴發戶重生。重生有效。這是我的設定檔的樣子

start on runlevel [2345]
stop on runlevel [06]

normal exit 0

respawn
respawn limit 5 300
instance $user

chdir /home/talha/syncservice/
script
   exec python sync.py $user
end script

問題是我希望在系統重新啟動時重新啟動這些實例作業。顯然,我無法在重新啟動時將所有使用者名稱作為實例參數傳遞,因為我不知道上次產生了什麼實例以及有多少實例。

有沒有一種方法可以讓新貴在重新啟動後保留實例作業的狀態表。為什麼我假設有一些「狀態表」?會有一個狀態表來追蹤崩潰時要重生的實例。否則它將無法重新產生實例作業。因此,如果這些表可以在重新啟動後保持不變,我的問題就會解決。

能否以某種方式實現持久性?新貴在哪裡追蹤其正在運行的作業?它僅存在於記憶體中還是文件中?

如果不能做到這一點,那就意味著該節

start on runlevel[2345]

例如工作沒有任何意義或好處。

答案1

您可以將使用者清單儲存到檔案中(本例為 user-sync.list)。若要還原使用者腳本,您可以在啟動時由 root 執行的 bash 腳本中使用 for 迴圈。您的初始化腳本稱為 user-sync:

#!/bin/sh
# /root/restore-user-sync.sh
for user in `cat user-sync.list`; do start user-sync user=$user; done

以 root 身分將其新增至 crontab:

$ crontab -e

在 cron 檔案中:

@reboot /root/restore-user-sync.sh

維護活躍用戶清單是最複雜的部分。您可以讓 python 腳本執行此操作,也可以將其作為 Upstart 腳本的一部分執行:

# /etc/init/user-sync.conf

start on runlevel [2345]
stop on runlevel [06]

normal exit 0

respawn
respawn limit 5 300
instance $user

chdir /home/talha/syncservice/

pre-start script
    # if $user doesn't already exist in list, add $user to list
    if ! grep $user user-sync.list; then echo $user >> user-sync.list; fi
end script

script
   exec python sync.py $user
end script

pre-stop script
    # remove line(s) from list that exactly match $user
    sed -i "/\b$user\b/d" user-sync.list
end script

您或許可以用 $USER (自動定義為目前使用者名稱)取代 $user,否則當您呼叫 upstart 腳本時,您需要將使用者名稱作為參數傳遞:

sudo start user-sync user=myusername

答案2

我一定會遠離暴發戶的面紗。您可以透過另一種方式做到這一點。

Cookbook 關於實例節的部分有一些關於如何做這樣的事情的例子。我對多個 PostgreSQL 執行個體執行類似的操作;看回答。

這裡的基本想法是創建我所謂的「小馬引擎」作業來啟動所有實例作業。在您的情況下,您可以讓它遍歷 的子目錄/home,或者保留一個單獨的conf 文件,其中列出您希望為其運行服務的用戶。為每個使用者啟動一個sync.py實例。

您是正確的,start on/stop on在實例作業中毫無用處。將其移至“小馬引擎”作業。

不幸的是,我現在無法存取 Linux 機器,但請參閱上述答案的範例。

相關內容