Скрипт оболочки 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(и любом другом) экземплярпо-видимому, работает дважды, один из них начался через bash, а другой через /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

Если вы запустите первый из них, то нет подоболочки, поэтому вы увидите только одну из них в списке процессов. Если вы запустите второй из них, то есть подоболочка, поэтому она разветвится, и вы увидите две из них в списке процессов. (Если вы хотите больше подробностей о вашей конкретной ситуации, то, пожалуйста, разместите полное содержимое вашего скрипта в вопросе.)

Связанный контент