Bash
systemd 服務文件關閉套接字
我需要使用 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 添加到腳本文件即可正常執行
我注意到您的場景中有兩件事:
- 你打電話
./test.sh
而不是/home/test01/testbinary
. 這讓我認為工作目錄可能對您的testbinary
. 如果您的測試二進製文件使用相對路徑,那麼它可能會在查找資源或寫入文件時出現問題。嘗試在[Service]
您的單元部分指定工作目錄。WorkingDirectory=/home/test01
- 您的服務執行方式為,
root
而您的測試執行方式為$USER
. 雖然root
通常可以做任何事情,但您的程序可能會創建AF_UNIX
其他程序(以非 root 身份執行)無法讀取/寫入的套接字。在這種情況下,請嘗試將其添加到
[Service]
您的設備部分。User=test01
我認為這不是
LD_LIBRARY_PATH
一個因素。如果這是一個因素,程序將立即失敗,exit-status (203)
並顯示一條很好的消息,告訴您哪個庫載入失敗。