Linux-Shell-Skript in Prozessliste dupliziert

Linux-Shell-Skript in Prozessliste dupliziert

Ich habe eineBash-Skriptdas Parameter akzeptiert:

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

Ich rufe es überCRONzu unterschiedlichen Zeitpunkten und mit unterschiedlichen Parametern:

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

Wenn Sie wissen möchten, wasInstanzen laufen(das Skript ist nicht sehr lang, die Ausführung dauert nur wenige Sekunden):

$ 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

Wir können im obigen Beispiel die MyScript.sh 21(und jede andere) Instanz sehenanscheinend zweimal gelaufen, einer davon startete über bashund der andere über /bin/sh -c. Beide starten und enden zur gleichen Zeit, wie ich mit bestätigt habe htop.

Ich führe diese Tests in RaspBian durch (Debianbasierend).

Nachfolgend sehen Sie ein Beispiel dafür, was passiert, wenn Sie dasselbe Skript ausführen aufFreeBSD:

$ 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

Wie man sieht, gibt es bei BSD diese wiederholten Fälle nicht.

Warum passiert dasauf RaspBian und wie könnte ichlösenes? Muss ich es überhaupt „lösen“?

Antwort1

Ihr Skript führt etwas innerhalb von Subshells aus. Beispiel:

#!/usr/bin/env bash

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

(sleep 10; echo inner done)
echo outer done

Wenn Sie die erste davon ausführen, gibt es keine Subshell, sodass Sie nur eine davon in der Prozessliste sehen. Wenn Sie die zweite davon ausführen, gibt es eine Subshell, sodass sie sich verzweigt und Sie zwei davon in der Prozessliste sehen. (Wenn Sie weitere Einzelheiten zu Ihrer genauen Situation wünschen, posten Sie bitte den vollständigen Inhalt Ihres Skripts in der Frage.)

verwandte Informationen