注:bashを使用していると思いましたが、/ bin/shは/bin/ dashにリンクされており、この奇妙なexecの問題があります。
Linux上にサーバープロセス(作成も制御もしなかった)を起動するために使用される単純なbashシェルスクリプトがあり、bashシェルスクリプトに起動されたプロセスのPIDをpidfileに出力させたいと考えています。
問題は、bash-execコマンドが自身のプロセスを起動されたサーバープロセスに置き換えないことです。
それで:
echo $$ | cat > /var/run/launched-server.pid
ファイル内のpidはサーバープロセスではなくbashのpidになるため、これは機能しません。また、サーバープロセスが終了した場合、bashは終了せず、愚かな起動スクリプトがプロセスリストに表示されないままになる可能性があります。
誰かがbash(またはダッシュかもしれません)を使用する方法を知っていますか?
- 出来ますか?
- 起動されたサーバーサーバープロセスのPIDは私のpidfileにありますか?
- 起動されたサーバーが存在するときにbashスクリプトが終了し、無効なシェルプロセスがプロセスリストに残っていないことを確認しますか?
編集: bashリファレンスマニュアルからのこのスニペットは役に立ちます...
exec
exec [-cl] [-a name] [command [arguments]]
コマンドが指定されている場合、新しいプロセスを作成せずにシェルを置き換えます。-lオプションが指定されている場合、シェルはコマンドに渡された0番目の引数の先頭にダッシュを配置します。これは、ログインプログラムが行うことです。-cオプションを指定すると、コマンドは空の環境で実行されます。-aを指定すると、シェルはnameをコマンドの0番目の引数として渡します。コマンドが指定されていない場合、リダイレクトを使用して現在のシェル環境に影響を与えることができます。リダイレクションエラーがない場合、リターンステータスはゼロです。それ以外の場合、戻りステータスはゼロ以外です。
編集2:これはスクリプトです(サニタイズされています):
#!/bin/sh
# this is where the server expects to run its services for Daemontools
SERVICE_DIR='/var/service';
# kill stdout, stderr, stdin
exec </dev/null
exec >/dev/null
exec 2>/dev/null
logger -ip daemon.debug -- stdout, stderr, stdin redirected to /dev/null
if [ -d $SERVICE_DIR ]; then
# sanitized...
logger -ip daemon.debug -- services and supervisors exited
else
logger -ip daemon.err -- $SERVICE_DIR does not exist, exiting
exit 1;
fi
if [ -d /var/run/pid ]; then
echo $$ | cat > /var/run/pid/launched-server.pid
logger -ip daemon.debug -- creating launched-server pidfile
fi
# start the server process
logger -ip daemon.info -- launching server on $SERVICE_DIR
exec /usr/local/bin/launched-server
そして、いくつかのps出力はおそらくもっと明確になりますか?
me@chainsaw: ~/dev $ ps ax | grep launched-server
13896 pts/1 S+ 0:00 /bin/sh ./server_boot
13905 pts/1 S+ 0:00 launched-server /var/service
13938 pts/2 R+ 0:00 grep --color=auto launched-server