Debian

systemd:在啟動 nginx 之前完成自定義 shell 腳本的執行

  • October 29, 2019

使用 Debian 9 stable,我想在啟動 NGINX 程序和 Shorewall 防火牆之前啟動一個自定義 shell 腳本:

  • 做一些初始化工作
  • 掛載一個目錄(overlayfs)來覆蓋/etcNGINX 配置、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

引用自:https://unix.stackexchange.com/questions/397516