Linux シェル スクリプトがプロセス リストに重複している

Linux シェル スクリプトがプロセス リストに重複している

私はBashスクリプトパラメータを受け入れる:

$ head -n 3 MyScript.sh
#!/usr/bin/env bash
# This is my script
#... do something

私はそれを介して呼び出しますクロン異なるスケジュールと異なるパラメータで:

$ crontab -l
* * * * * MyScript.sh 1 -t 600
*/2 * * * * MyScript.sh 40
*/3 * * * * MyScript.sh 41,42
*/5 * * * * MyScript.sh 61
* * * * * MyScript.sh 21

何を知りたいのかインスタンスが実行中(スクリプトはそれほど長くなく、実行時間は数秒だけです):

$ pgrep -f -a -l "MyScript.sh"
25003 /bin/sh -c MyScript.sh 21
25005 /bin/sh -c MyScript.sh 41,42
25006 bash /bin/MyScript.sh 21
25007 bash /bin/MyScript.sh 41,42
25008 /bin/sh -c MyScript.sh 40
25009 bash /bin/MyScript.sh 40
25010 /bin/sh -c MyScript.sh 1 -t 600
25012 bash /bin/MyScript.sh 1 -t 600

上記の例MyScript.sh 21(および他の例)では、どうやら2回実行されているようだ、1 つは 経由で開始されbash、もう 1 つは 経由で/bin/sh -c開始されました。 で確認したところ、両方とも同時に開始および終了しますhtop

私はこれらのテストをRaspBianで実行しています(デビアンベース)。

以下は、同じスクリプトを実行した場合の結果の例です。フリーBSD:

$ pgrep -f -a -l "MyScript.sh"
78230 bash /bin/MyScript.sh 103
78106 bash /bin/MyScript.sh 470
77484 bash /bin/MyScript.sh 2
77430 bash /bin/MyScript.sh 451
77019 bash /bin/MyScript.sh 52
76922 bash /bin/MyScript.sh 101 -v -d
76642 bash /bin/MyScript.sh 1 -t 600
76174 bash /bin/MyScript.sh 102 -v -d

ご覧のとおり、BSD にはこのような繰り返しインスタンスはありません。

なぜこうなったRaspBianでどうすれば解決する実際のところ、それを「解決」する必要はあるのでしょうか?

答え1

スクリプトはサブシェル内で何かを実行しています。例:

#!/usr/bin/env bash

sleep 10
echo outer done
#!/usr/bin/env bash

(sleep 10; echo inner done)
echo outer done

最初のものを実行するとサブシェルがないので、プロセス リストには 1 つだけ表示されます。2 つ目のものを実行するとサブシェルがあるので、フォークしてプロセス リストに 2 つ表示されます。(正確な状況の詳細を知りたい場合は、質問にスクリプトの全内容を投稿してください。)

関連情報