nohup を使用してサーバーを起動し、入出力をリダイレクトします。

nohup を使用してサーバーを起動し、入出力をリダイレクトします。

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を変数ではなくファイルに入れますが、もちろん簡単に変数に戻すこともできます。

関連情報