1つのスクリプトが3つのプロセスを実行するのはなぜですか?

1つのスクリプトが3つのプロセスを実行するのはなぜですか?

crontabには次の行があります。

@reboot /usr/bin/teamspeak3-server_linux-amd64/ts3server_minimal_runscript.sh

再起動すると、スクリプトはバックグラウンドで実行されますが(Teamspeak 3サーバーの起動など)、停止する方法を探しています。 (これはバックグラウンドで実行されているため、端末でCtrl + Cを押すことはできません。))フォーラムの投稿によると、次のコマンドを使用してプロセスを終了できます。

ps -ef | grep -i XXXX:  to find your background running process

kill OID : kill your unnecessary process

私は彼が言ったOIDがPIDを意味すると思った。ところでこれを私のシナリオに適用してみると以下のように3つのプロセスが実行されていることを発見します。

$ps -ef | grep ts3
server     889    586  0  22:33  ?       00:00:00 /bin/sh -c /usr/bin/teamspeak3-server_linux-amd64/ts3server_minimal_runscript.sh
server     890    889  0  22:33  ?       00:00:00 /usr/bin/teamspeak3-server_linux-amd64/ts3server_minimal_runscript.sh
server     903    890  0  22:33  ?       00:00:00 ./ts3server_linux_amd64

混乱しています。なぜ3つのプロセスが実行されているのですか?私は1つのスクリプトだけが実行されることを期待しています(つまり、中間行だけを想像します)。 3つのプロセスをすべて終了するとスクリプトが停止するようですが、ここに1つのプロセスではなく3つのプロセスがある理由を知りたいです。

ベストアンサー1

最初のプロセスはスクリプトを実行するシェルです。

2番目のプロセスはスクリプトのシェルサブプロセスです。おそらく、角かっこ内で実行されるコマンドによってプロセスが分岐する可能性があります。例: "(date;cat)"。

3番目のプロセスは、実行する物理サーバーのバイナリです。

サーバーをシャットダウンするには、3番目のプロセスを終了してください。これにより、子プロセスが終了してからデフォルトのシェルスクリプトが終了する可能性があります。ただし、サブプロセスは、サーバーがシャットダウンして再起動されるのを待つシェルループです。したがって、再生成されないように、2 番目と 3 番目のプロセスを終了する必要があるかもしれません。

バックグラウンドで実行するように設計されたほとんどのプログラムには、より良いシャットダウン方法があります。たとえば、/etc/init.dで始まるデーモンは、通常、「start」、「stop」、「restart」などのパラメータを使用してスクリプトを呼び出して制御できます。あなたのサーバーにも同様のシステムがあるかもしれません。

おすすめ記事