1

注: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(またはダッシュかもしれません)を使用する方法を知っていますか?

  1. 出来ますか?
  2. 起動されたサーバーサーバープロセスのPIDは私のpidfileにありますか?
  3. 起動されたサーバーが存在するときに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
4

2 に答える 2

3

私は今、本当の問題が何であったかを理解しています:

使用する#!/bin/shことで、bash を呼び出すのではなく、dash を呼び出しました。

Dash の exec は、exec 問題のあるシェルです。最初から使っていれば#!/bin/bash、期待通りに機能したのに。

于 2010-09-01T16:03:13.770 に答える
1

あなたのディストリビューションには が含まれていますstart-stop-daemon(8)か? 非常に便利な小さなツールで、シェル スクリプトからデーモンを起動するために特別に作成されました。(もちろん、デーモンはシェル スクリプトよりも長く存続するため、完全に一致するとは限りません。シェルをデーモンより長く存続させたい理由によって異なります。)

または、もっと簡単な場合:

あなたの問題は bash のexecコマンドで解決できますか? シェルプロセスを、実行するように要求するプログラムに置き換えます。

#!/bin/bash

echo $$ > /tmp/pidfile
exec /bin/sleep 60

$ ./show_exec.sh 
[nothing happens]

そして、別のシェルで:

$ cat pidfile
24686
$ ps auxw | grep 24686
sarnold  24686  0.0  0.0   9728   816 pts/1    S+   04:53   0:00 /bin/sleep 60
于 2010-09-01T11:55:00.023 に答える