Bash

systemd 服務文件關閉套接字

  • May 10, 2022

我需要使用 systemd 執行 C++ 二進製文件。

當我直接或使用bash腳本執行二進製文件時,它可以執行好幾天:

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

test.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 服務執行時才會發生。

只需將 LimitNOFile=5000 添加到腳本文件即可正常執行

我注意到您的場景中有兩件事:

  1. 你打電話./test.sh而不是/home/test01/testbinary. 這讓我認為工作目錄可能對您的testbinary. 如果您的測試二進製文件使用相對路徑,那麼它可能會在查找資源或寫入文件時出現問題。嘗試在[Service]您的單元部分指定工作目錄。
WorkingDirectory=/home/test01
  1. 您的服務執行方式為,root而您的測試執行方式為$USER. 雖然root通常可以做任何事情,但您的程序可能會創建AF_UNIX其他程序(以非 root 身份執行)無法讀取/寫入的套接字。

在這種情況下,請嘗試將其添加到[Service]您的設備部分。

User=test01

我認為這不是LD_LIBRARY_PATH一個因素。如果這是一個因素,程序將立即失敗,exit-status (203)並顯示一條很好的消息,告訴您哪個庫載入失敗。

引用自:https://unix.stackexchange.com/questions/700692