Pythonソケットサーバーを起動するinit.dスクリプトがあります。デーモンとして実行したいので、nohupを使って始めます。また、stdoutとstderrをログファイルにリダイレクトしたいと思います。私の問題は、プロセスのPIDをキャプチャしてファイルに保存しようとしていますが、それを行うことができないようです。
# Start server
echo "Starting server."
nohup ${PROGDIR}/${PROGNAME} -l $IPADDR >>${LOGDIR}/${OUTLOG} 2>>${LOGDIR}/${OUTLOG} </dev/null &
PID=$!
PIDをキャプチャできますが、リダイレクトは機能しません。 (プログラムの代わりにnohupをリダイレクトしていますか?)
次に、次のようなことを試しました。
nohup /bin/bash -c '...'
しかし、PIDを失いました。この時点でPIDを取得しているようですnohup /bin/bash -c
。私はシェルスクリプトに慣れていないので、足に銃を撃つ前に助けを求めたかった。
だから私の質問は、PIDをキャプチャし、サーバー出力をログファイルにリダイレクトする方法です。私はDebian(ラズベリーパイ)を使用しており、rc-update.dを使用して初期化スクリプトを作成しています。
答え1
Debian バリアントを使用している場合は、start-stop-daemon
これを使用できます。これは、より簡潔な方法で行われます。特に:
start-stop-daemon --make-pidfile --pidfile "$PIDFILE" --background \
--no-close --exec "${PROGDIR}/${PROGNAME}" --start -- -l "$IPADDR" \
>> "${LOGDIR}/${OUTLOG}" 2>> "${LOGDIR}/${OUTLOG}" </dev/null
あなたが望むものに非常に近いはずです。 PIDを変数ではなくファイルに入れますが、もちろん簡単に変数に戻すこともできます。