我已经编写了一个 systemd 服务。
当我运行 时systemctl start foo.service
,服务启动并正确运行,但systemctl
不会立即返回到 shell。
过了一会儿它退出了
Job for foo.service failed because a timeout was exceeded.
然后该服务不再运行。
这是 foo.service,我阅读手册并使用了Type=forking
一个分叉命令:
[Unit]
Description=blah blah
[Service]
Type=forking
PIDFile=/var/run/myservice.pid
ExecStart=/my/path/fork my-script my-args
[Install]
WantedBy=multi-user.target
my-script
本身不分叉,因此/my/path/fork
如下
#!/bin/bash
PATH="$PATH:/my/path" "$@" &
为什么此服务没有按预期分叉并在后台运行?我在 CentOS 上以 root 身份完成了所有操作。
答案1
服务类型=分叉是用于真正分叉程序(例如 apache)。您的 bash 脚本仅在后台运行另一个脚本。这并不是 systemd 想要的分叉程序。为什么您使用
Type=forking
,当你的脚本my-script是正常简单服务的时候?
尝试更改服务类型并直接使用以下命令运行脚本:
[Service]
Type=simple
PIDFile=/var/run/myservice.pid
ExecStart=/my/path/my-script my-args
和删除整个 /my/path/fork文件。我看不出它有什么好处。
您也可以尝试设置超时开始时间=1服务配置文件选项。
我正在使用包含无限循环的 bash 脚本,其配置如下:
[Service]
User=root
ExecStart=/root/ha.sh
WorkingDirectory=/root/
KillSignal=SIGKILL
Restart=on-abort
Type=simple
TimeoutStartSec=1
TimeoutStopSec=1
StandardError=syslog
NotifyAccess=all