systemdを使用してC ++バイナリを実行する必要があります。
バイナリを直接実行するか、スクリプトを使用すると、bash
数日間正常に実行されます。
nohup ./testbinary &
./test.sh
テスト.sh:
#!/bin/bash
LD_LIBRARY_PATH="/home/test01/lib/"
export LD_LIBRARY_PATH
/home/test01/testbinary
ただし、次のシステムサービスファイルを使用してこのスクリプトを実行すると:
[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分ほど実行するとエラーが発生し、サービスを再起動する必要があります。
このバイナリを介して他のアプリケーションに確立されたソケット接続に失敗しました。これは、バイナリがシステムサービスとして実行されている場合にのみ発生します。
答え1
あなたのシナリオで2つのことを見つけました。
./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)
どのライブラリがロードに失敗したかを示す素晴らしいメッセージで、プログラムはすぐに失敗します。
答え2
スクリプトファイルにLimitNOFile = 5000を追加すると、正常に実行されます。