我在为一个简单的守护进程编写单元文件时遇到了这个问题。当守护进程在启动时返回 '1' 时,systemd 只是忽略它,看起来守护进程已经成功启动,而实际上它已经死了。
例如,我有非常简单的 shell 脚本:
#!/bin/bash
exit 1
Run Code Online (Sandbox Code Playgroud)
所以单元文件看起来像这样:
[Unit]
Description=test service
After=syslog.target
[Service]
User=testuser
Group=testuser
ExecStart=/usr/local/bin/return1
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
尝试开始,似乎没问题:
# service testservice start
# echo $?
0
Run Code Online (Sandbox Code Playgroud)
但实际上它已经死了:
# service testservice status
? testservice.service - test service
Loaded: loaded (/etc/systemd/system/testservice.service; enabled)
Active: failed (Result: exit-code) since Fri 2016-01-22 14:51:45 MSK; 1min 13s ago
Process: 16416 ExecStart=/usr/local/bin/return1 (code=exited, status=1/FAILURE)
Main PID: 16416 (code=exited, status=1/FAILURE)
Jan 22 14:51:45 servername systemd[1]: Started test service.
Jan 22 14:51:45 servername systemd[1]: testservice.service: main process exited, code=exited, status=1/FAILURE
Jan 22 14:51:45 servername systemd[1]: Unit testservice.service entered failed state.
Run Code Online (Sandbox Code Playgroud)
看起来 systemd 认为守护进程启动成功,但后来崩溃了。
我试图通过将服务类型更改为“分叉”等来解决此问题 - 这在非零代码的情况下工作正常,但服务实际上是“简单”的,因此在成功启动的情况下,它只会保留并保持终端忙。
我如何管理此类服务?或者可能有必要修复守护程序代码中的某些内容?
操作系统 debian 8 x64,systemd 215
对于systemd到如果进程已成功启动,你必须使用检测Type=forking,然后你叉过程的辅助脚本,该脚本检查过程中已成功启动。Forkingsystemd将等待ExecStart命令完成并检查其退出状态。
您应该像这样更改单元文件:
[Unit]
Description=test service
After=syslog.target
[Service]
Type=forking
User=testuser
Group=testuser
ExecStart=/usr/local/bin/fork_service
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
和/usr/local/bin/fork_service你应该有这样的事情:
#!/bin/bash
# Run your process in background
/path/to/your_service &
# Check if the services started successfully
if ! kill -0 $! 2>/dev/null; then
# Return 1 so that systemd knows the service failed to start
exit 1
fi
Run Code Online (Sandbox Code Playgroud)
我在这里只是检查后台进程 PID 是否仍处于活动状态,但您可以进行任何您想要的检查。唯一重要的是,如果进程成功启动,则此脚本以 0 退出,如果失败则以非零正值退出。
此外,您不必使用 Bash 来分叉进程,您可以使用任何您想要的语言。
| 归档时间: |
|
| 查看次数: |
14242 次 |
| 最近记录: |