Linuxシェルスクリプトはプロセスリストに重複しています。

Linuxシェルスクリプトはプロセスリストに重複しています。

バッシュスクリプトパラメータ承認:

$ 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上記の例(およびその他)の例で見ることができます。きっと二度走った。、1つはviaで始まりbash、もう1つはviaで始まります/bin/sh -c。私が確認したように、両方とも同時に開始して終了しますhtop

RaspBianでこのテストを実行しています(ダーバン)に基づいています。

以下は、同じスクリプトを実行したときに発生することの例です。FreeBSD:

$ 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つ表示されます。 (特定の状況について詳しく知りたい場合は、質問にスクリプトの全内容を投稿してください。)

おすすめ記事