Bash

如何在 systemd 中創建自定義服務?

  • May 30, 2021

在多台機器上執行 Fedora 33/34。我成功啟動rc-local.service了它工作正常。我有幾個需要執行的其他腳本,/etc/init.d/並且我創建了與 類似的服務文件rc-local.service,但我無法啟用它,而 rc-local.service 可以毫無問題地啟用/禁用/啟動/停止。
我知道,我有一個選項(我目前使用)從rc.local文件中呼叫這些腳本,但寧願將它們作為服務單獨呼叫。所以我的服務文件如下所示:

#cat net-scr1.service

[Unit]
Description=Network check service
ConditionFileIsExecutable=/etc/init.d/net-scr1
After=network.target 

[Service]
Type=forking
ExecStart=/etc/init.d/net-scr1 start
TimeoutSec=3
ExecStop=/etc/init.d/net-scr1 stop
RemainAfterExit=yes
GuessMainPID=no
StandardOutput=tty

[Install]
WantedBy=multi-user.target

systemctl enable net-scr1

Synchronizing state of net-scr1.service with SysV service script with /usr/lib/systemd/systemd-sysv-install.
Executing: /usr/lib/systemd/systemd-sysv-install enable net-scr1
service net-scr1 does not support chkconfig

我將腳本移出init.d考慮可能 systemd 假設它是一個舊sysv腳本,但沒有改變。我的腳本中應該有什麼才能正常工作?

我的腳本看起來像:

#!/bin/bash
EMFR=admin@server1.com
eml=admin@mydomain.com
dv0=p1p1
ipdv0=`ifconfig $dv0 | grep "inet " | awk '{print $2}'`
if [ "$1" = "stop" ]; then
 cat $msg | mail $EMFR -s "$srv-shut_down-ip-$ipdv0" $eml
fi
if [ "$1" = "start" ]; then
 cat $msg | mail $EMFR -s "$srv-booted_up-ip-$ipdv0" $eml  

fi

我應該包含舊 sysv 系統中的函式還是其他什麼?謝謝

我找到了解決方案。我在腳本頂部包含以下 3 行:

head /etc/init.d/net-scr1

# net-scr1          Start/Stop the net script1
# chkconfig: 345 90 10
# description: net-scr1 sends alert on reboot

現在systemctl enable net-scr1 工作正常

看到這個

  1. cd /etc/systemd/系統
  2. 創建一個名為 your-service.service 的文件並包含以下內容:
[Unit]
Description=<description about this service>

[Service]
User=<user e.g. root>
WorkingDirectory=<directory_of_script e.g. /root>
ExecStart=<script which needs to be executed>
Restart=always

[Install]
WantedBy=multi-user.target

引用自:https://serverfault.com/questions/1065129