systemd:在啟動 nginx 之前完成自定義 shell 腳本的執行
使用 Debian 9 stable,我想在啟動 NGINX 程序和 Shorewall 防火牆之前啟動一個自定義 shell 腳本:
- 做一些初始化工作
- 掛載一個目錄(overlayfs)來覆蓋
/etc
NGINX 配置、shorewall 配置和/etc/hosts
- 腳本也以 結尾
sync
,不確定這是否是個好主意systemctl list-dependencies
default.target
● ├─display-manager.service
● ├─systemd-update-utmp-runlevel.service
● └─multi-user.target
● ├─console-setup.service
● ├─cron.service
● ├─dbus.service
● ├─dropbear.service
● ├─myservice.service <–我的服務(使用systemctl enable創建的連結)
● ├─networking.service
● ├─nginx.service <–在myservice之後執行
$$ … $$
● ├─basic.target
● │ ├─-.mount
● │ ├─myservice.service <– 我的服務(使用 systemctl enable 創建的連結)
● │ ├─shorewall.service <– 在 myservice 之後執行
myservice.service 嘗試 1
$$ Unit $$
Description=我的啟動服務
Requires=shorewall.service nginx.service
Before=shorewall.service nginx.service
$$ Service $$
RemainAfterExit=yes
ExecStart=/usr/local/bin/myservice start
ExecStop=/usr/local/bin/myservice stop
$$ Install $$
WantedBy=多使用者.target
WantedBy=basic.target
日誌:
日誌控制
$$ … $$
10 月 12 日 11:31:43 server-dev nginx$$ 448 $$: nginx:$$ emerg $$
在 /etc/nginx/sites-enabled/default:33 Oct 12 11:31:43 server-dev nginx的上游“server-dev.com”中找不到主機$$ 448 $$: nginx: 配置文件 /etc/nginx/nginx.conf 測試失敗 <== NGINX: BAD
Oct 12 11:31:43 server-dev systemd$$ 1 $$: nginx.service: 控制程序退出,code=exited status=1
Oct 12 11:31:43 server-dev systemd$$ 1 $$: 無法啟動高性能 Web 伺服器和反向代理伺服器。
10 月 12 日 11:31:43 server-dev systemd$$ 1 $$: nginx.service: 單元進入失敗狀態。
10 月 12 日 11:31:43 server-dev systemd$$ 1 $$:nginx.service:失敗,結果為“退出程式碼”。
10 月 12 日 11:31:43 server-dev systemd$$ 1 $$:達到目標多使用者系統。
10 月 12 日 11:31:43 server-dev systemd$$ 1 $$:達到目標圖形界面。
10 月 12 日 11:31:43 server-dev systemd$$ 1 $$:開始更新 UTMP 關於系統執行級別更改…
10 月 12 日 11:31:43 server-dev systemd$$ 1 $$: 開始更新關於系統執行級別更改的 UTMP。
10 月 12 日 11:31:43 server-dev server$$ 423 $$: DO: server start DONE <== END OF SCRIPT myservice
Oct 12 11:31:43 server-devshorewall$$ 449 $$: 使用 Shorewall 5.0.15.6 編譯… <== SHOREWALL: GOOD
Oct 12 11:31:44 server-devshorewall$$ 449 $$: 處理 /etc/shorewall/shorewall.conf…
10 月 12 日 11:31:44 server-devshorewall$$ 449 $$: 載入模組…
在執行 myservice 之後,Shorewall 系統地正確啟動。Nginx 大部分時間是在執行 myservice 期間啟動的,之前
/etc
被正確覆蓋(覆蓋?),因此無法正確初始化。myservice.service 嘗試 2
我也試圖改變
$$ Install $$
WantedBy=default.target
並改變
$$ Unit $$
之前=多使用者.target
它也不起作用。
myservice執行後如何保證nginx和shorewall啟動?
如果您不指定 systemd 服務的類型,則預設為
Type=simple
. 這意味著該服務在其主要服務程序被分叉時被認為已啟動(此時它甚至還沒有執行ExecStart
命令)。您可能想Type=oneshot
改用它,它在考慮服務啟動之前等待ExecStart
命令退出。有關詳細資訊,請參閱man systemd.service
。