systemd 服务文件关闭套接字

systemd 服务文件关闭套接字

我需要使用 systemd 运行 C++ 二进制文件。

当我直接执行二进制文件或使用bash脚本执行该二进制文件时,它可以正常运行几天:

  • nohup ./testbinary &
  • ./test.sh

测试.sh:

#!/bin/bash
LD_LIBRARY_PATH="/home/test01/lib/"
export LD_LIBRARY_PATH
/home/test01/testbinary

但是当我使用以下 systemd 服务文件执行此脚本时:

[Unit]
Description=cr06

Wants=network.target
After=syslog.target network-online.target

[Service]
Type=simple
ExecStart=/home/test01/test.sh
Restart=on-failure
RestartSec=10
KillMode=process

[Install]
WantedBy=multi-user.target

它运行了一段时间,比如 6 到 7 分钟,然后出现错误,我需要重新启动服务。

该二进制文件与其他应用程序建立的套接字连接失败。仅当二进制文件作为 systemd 服务执行时才会发生。

答案1

我注意到你的场景中有两件事:

  1. 您正在调用./test.sh而不是/home/test01/testbinary.这让我认为工作目录可能对您的testbinary.如果您的测试二进制文件使用相对路径,那么它可能会在查找资源或写入文件时出现问题。尝试在[Service]您的设备部分指定工作目录。

    WorkingDirectory=/home/test01
    
  2. 您的服务运行为,root而您的测试运行为$USER。虽然root通常可以做任何事情,但您的程序可能会创建AF_UNIX其他进程(以非 root 身份运行)无法读取/写入的套接字。

    在这种情况下,请尝试将其添加到[Service]您设备的部分。

    User=test01
    

我认为LD_LIBRARY_PATH这不是一个因素。如果这是一个因素,程序将立即失败,exit-status (203)并显示一条很好的消息,告诉您哪个库无法加载。

答案2

只需将 LimitNOFile=5000 添加到脚本文件即可正常运行

相关内容