为什么 `systemctl start myservice` 不 fork 这个服务?

为什么 `systemctl start myservice` 不 fork 这个服务?

我已经编写了一个 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

相关内容