我正在使用 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 機器,但請參閱上述答案的範例。