我正在尝试创建/运行一项服务,即使用 systemd 在启动时启动一个脚本。
首先,当我用测试我的脚本时$ /usr/bin/pastec.sh
,它运行良好。
因此,我尝试创建我的服务:
$ sudo nano /etc/systemd/system/pastec.service
看起来像:
[Unit]
Description=Pastec Service
[Service]
ExecStart=/usr/bin/pastec.sh
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
然后,启动它:
systemctl daemon-reload
systemctl enable pastec.service
systemctl start pastec
代码执行,没有返回错误。
root# systemctl start pastec
root#
但是当我运行时,服务/任务不存在ps aux | grep pastec
注意:我在 Ubuntu 14.04 上使用 init.d 在启动时运行此脚本 - 现在我想使用 systemd 在 Ubuntu 18.04 上运行它。
我错过了什么 ?
编辑 1:正如 PonJar 所询问的,这是我所看到的systemctl status pastec
● pastec.service - Pastec Service
Loaded: loaded (/etc/systemd/system/pastec.service; enabled; vendor preset: enabled)
Active: activating (auto-restart) since Wed 2019-10-02 06:01:07 UTC; 4s ago
Process: 8339 ExecStart=/usr/bin/pastec.sh (code=exited, status=0/SUCCESS)
Main PID: 8339 (code=exited, status=0/SUCCESS)
但是用 grep 找不到 pastec 的踪迹...
答案1
经过多次搜索,我找到了答案线。
我添加了Type=forking
服务指令并且该脚本确实由服务启动。
Main PID: 12645 (pastec)
Tasks: 1 (limit: 4915)
CGroup: /system.slice/pastec.service
└─12645 ./pastec visualWordsORB.dat
虽然默认的 Type=simple 适用于许多 Systemd 服务文件,但当 ExecStart 中的脚本启动另一个进程并完成时,它不起作用,就像 graphite 的 carbon-cache.py 的情况一样。在这些情况下,您需要在 [Service] 部分中明确指定 Type=forking,以便 Systemd 知道查看生成的进程而不是初始进程。