基本的に私が達成したいのは、node.jsソケットサーバースクリプトをサービスとして開始するためのある種のスクリプトまたはメソッドです。
これは、SSHで「nodeserver.js」を物理的に実行し、開いたままそこに座る必要がないようにするためです。
どんな助けでもいただければ幸いです。
ありがとうスコット
以外の何かを使いたいという犯罪者は見当たりませんforever
。私のプロジェクトでは、この種のツールの使用を避け、システム機能に依存しています。また、アプリケーションをrootとして実行しないようにしているため、SystemVもUpstartも使用できません。
そして、ここに強力なものが来shell scripting
ます!開始、停止、再起動、ステータスの照会bash
など、単純なタスクを実行するスクリプトをいくつか作成しました。process watchdog
このコードを確認してください。自由に変更してください。これを使用するには、コマンドをCOMMANDパラメーターに入れます。そして、を実行し./path_to_script.sh -start
ます。これにより、ウォッチドッグプロセスが作成され、ノードプロセスが開始され、ノードプロセスが停止するかどうかが監視され、停止する場合は再起動されます。理想的とは言えないので、修正、追加、削除するものがある場合は、以下にコメントしてください。
#!/bin/bash
CURRENT_PATH=$(pwd)
LOGFOLDER=$CURRENT_PATH"/logs/"
PIDFOLDER=$CURRENT_PATH"/pid/"
#PID file where the this script process ID is stored
WATCHDOGPIDFILE=$PIDFOLDER"watchdog-admin.pid"
#PID file where the node process ID is stored
NODEPIDFILE=$PIDFOLDER"node-admin.pid"
#Watchdog process error log file
WATCHDOGLOGFILE=$LOGFOLDER"admin-watchdog-error.log"
#Node process error log file
NODELOGFILE=$LOGFOLDER"admin-error.log"
#Command to be executed on daemon start
COMMAND="node ./admin/app.js 1> /dev/null 2>> $NODELOGFILE"
ARG_1=$1
start() {
if [ -e $NODEPIDFILE ]; then
PID=$(cat $NODEPIDFILE)
if [ $(ps -o pid | grep $PID) ]; then
return;
else
touch $NODEPIDFILE
nohup $COMMAND &
echo $! > $NODEPIDFILE
fi
else
touch $NODEPIDFILE
nohup $COMMAND &
echo $! > $NODEPIDFILE
fi
}
stop() {
if [ -e $NODEPIDFILE ]; then
PID=$(cat $NODEPIDFILE)
if [ $(ps -o pid | grep $PID) ]; then
kill -9 $PID
fi
rm $NODEPIDFILE
fi
}
stopdaemon() {
stop
rm $WATCHDOGPIDFILE
exit 0
}
log() {
echo $1 >> $WATCHDOGLOGFILE
}
keep_alive() {
if [ -e $NODEPIDFILE ]; then
PID=$(cat $NODEPIDFILE)
if [ $(ps -o pid | grep $PID) ]; then
return;
else
log "Jim, he is dead!! Trying ressurection spell..."
start
fi
else
start
fi
}
case x${ARG_1} in
x-start )
echo "Starting daemon watchdog"
nohup "$0" -daemon &> /dev/null &
;;
x-daemon )
if [ -e $WATCHDOGPIDFILE ]; then
PID=$(cat $WATCHDOGPIDFILE)
if [ $(ps -o pid | grep $PID) ]; then
exit 0;
fi
fi
touch $WATCHDOGPIDFILE
echo $$ > $WATCHDOGPIDFILE
#trap the interruption or kill signal
trap stopdaemon INT SIGINT TERM SIGTERM
start
while true; do
keep_alive
wait
sleep 1
done
;;
x-stop )
echo "Stopping daemon watchdog"
PID=$(cat $WATCHDOGPIDFILE)
kill $PID
;;
x-status )
#check if process is running and PID file exists, and report it back
;;
x )
echo "Usage {start|stop|status}"
esac
exit 0
これはすぐに複雑になります。あなたが本当に求めているのは、プロセスを「デーモン化」する方法です。単にバックグラウンドで実行するだけではありません。理想的には、リムーバブルファイルシステムを拘束しないように実行し、ログ出力を保持し、古い端末に吐き出さないようにする必要があります。シェルが終了するときなどに誤って殺されたくない...
UbuntuのようなDebianベースのシステムを使用している場合は、/sbin/start-stop-daemon
必要なことの多くを実行します。そのためのUbuntuUpstart構成を作成することが言及されましたが、それもオプションです。Fedoraのような他のディストリビューションでは、systemdは、この自動デーモン化サービスの「金メッキ」バージョンと一般に見なされているものを提供します。基本的に、明示的に対話型ではないすべてのプログラムをデーモン化して管理できます。