Ich versuche, ein robustes Bash-Skript zu schreiben, und darin erstelle ich einen Hintergrundprozess. Am Ende des Skripts möchte ich es töten. Ich habe es PID.
Ich dachte an so etwas
while [[ ps ef $PID ]] ; do
kill $PID
sleep 0.5
done
Irgendwelche Vorschläge für etwas Besseres? Mögliche Probleme mit diesem Ansatz?
ps -ef
?while [[ ps ef $PID ]]
ist ein Syntaxfehler. Ich nehme an, du meintestwhile ps ef $PID
.Antworten:
Das Problem beim wiederholten Beenden eines Prozesses besteht darin, dass Sie eine Race-Bedingung für die Erstellung neuer Prozesse haben. Es ist nicht besonders wahrscheinlich, aber es ist möglich, dass der Prozess beendet wird und ein neuer Prozess mit derselben PID gestartet wird, während Sie schlafen.
Warum müssen Sie den Prozess wiederholt abbrechen? Wenn der Prozess beendet wird, das Beenden nach dem Empfang des Signals jedoch einige Zeit dauern kann, können Sie Folgendes verwenden
wait
:In einem idealen System müssten Sie niemals ein
kill
oder ein Problem wiederholenkill -9 $PID
. Wenn Sie müssen, sollten Sie in Betracht ziehen, das zu reparieren, was gerade ausgeführt wird, damit Sie es nicht müssen. In der Zwischenzeit werden Sie wahrscheinlich die Rennbedingung nicht erreichen, und Sie können sich dagegen schützen, indem Sie (sagen wir) den Zeitstempel von / proc / $ PID / überprüfen, bevor Sie den Prozess beenden. Das ist allerdings eine schlechte Hackiness.quelle
bash: wait: pid 32137 is not a child of this shell
wenn ich es versuche. :(Für alle, die den Schritt von
kill $PID
bis empfehlenkill -9 $PID
, muss ich Sie an die nutzlose Verwendung von kill -9 erinnern .Jetzt stimme ich dem "Entfernen des binären Teils" nicht zu, aber der Fortschritt scheint weniger schädlich als nur ein
kill -9
.Ich stimme auch der Sorgfalt bezüglich der Rennbedingungen bei der Schaffung neuer Prozesse mit derselben hier erwähnten PID zu .
quelle
Mach zuerst deinen normalen Kill, schlafe x Anzahl von Sekunden und töte ihn dann -9, wenn er noch da ist. Dies scheint auch eine seltsame Situation zu sein, in die Sie geraten sind. Vielleicht möchten Sie uns das größere Problem erklären.
quelle
Normalerweise möchten Sie es
kill $PID
zuerst versuchen .Lassen Sie es dann ein wenig schlafen, um zu sehen, ob es ordnungsgemäß beendet wird.
Wenn nicht, dann ausführen,
kill -9 $PID
um es gewaltsam loszuwerden.quelle
warum nicht einfach
kill -9 $PID
quelle