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」などのパラメータを使用してスクリプトを呼び出して制御できます。あなたのサーバーにも同様のシステムがあるかもしれません。

答え2

他のアプリケーションを実行するためのコマンドを含むスクリプトを1つ実行しているため、3つのプロセスが実行されています。

  1. Bash(スクリプト実行)
  2. それ自体script
  3. これapp

スクリプト内部:

root@onare:/home/onare# cat Downloads/TeamSpeak3-Client-linux_amd64/ts3client_runscript.sh 
#!/bin/bash

export KDEDIRS=
export KDEDIR=
export QTDIR=.
export QT_PLUGIN_PATH=.
export LD_LIBRARY_PATH=".:$LD_LIBRARY_PATH"

D1=$(readlink -f "$0")
D2=$(dirname "${D1}")
cd "${D2}"

if [ -e ts3client_linux_x86 ]; then
    ./ts3client_linux_x86 $@
else
    ./ts3client_linux_amd64 $@
fi

grepを使用して実行中のすべてのプロセスを知りたい場合は、次のコマンドを使用できます。

pgrep ts3一致するすべてのPIDを求めるメッセージが表示されます。*ts3*

次に、次を実行します。

kill -9 $(pgrep ts3)

これにより、ts3を実行しているすべてのPIDが終了します。

春夏シーズン:

添付:リスト

関連情報