Wie zum senden eines SIGINT, um von Python aus ein bash-script?
Ich soll zum starten einer hintergrund-Python-job von einem bash-Skript und dann elegant töten es mit SIGINT. Dies funktioniert von der shell, aber ich kann nicht scheinen, um es an die Arbeit in einem Skript.
loop.py:
#! /usr/bin/env python
if __name__ == "__main__":
try:
print 'starting loop'
while True:
pass
except KeyboardInterrupt:
print 'quitting loop'
Aus der shell kann ich es unterbrechen:
$ python loop.py &
[1] 15420
starting loop
$ kill -SIGINT 15420
quitting loop
[1]+ Done python loop.py
kill.sh:
#! /bin/bash
python loop.py &
PID=$!
echo "sending SIGINT to process $PID"
kill -SIGINT $PID
Aber aus einem Skript kann ich nicht:
$ ./kill.sh
starting loop
sending SIGINT to process 15452
$ ps ax | grep loop.py | grep -v grep
15452 pts/3 R 0:08 python loop.py
Und, wenn es gestartet wurde aus einem Skript kann ich nicht mehr töten, es aus der shell:
$ kill -SIGINT 15452
$ ps ax | grep loop.py | grep -v grep
15452 pts/3 R 0:34 python loop.py
Ich bin angenommen, ich bin fehlen einige feine Punkt der bash-job-control.
InformationsquelleAutor Ryan | 2009-06-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du bist nicht registriert werden, ein signal-handler. Versuchen Sie, die unten. Es scheint zu funktionieren ziemlich zuverlässig. Ich denke, die seltene Ausnahme ist, wenn es fängt das signal vor Python registriert das Skript handler. Beachten Sie, dass KeyboardInterrupt soll nur erhoben werden, "wenn der Benutzer trifft die interrupt-Taste". Ich denke, die Tatsache, dass es funktioniert für eine explizite (z.B. via kill) SIGINT an alle ist ein Unfall der Umsetzung.
18.8. signal — Set handlers for **asynchronous** events
Die Tatsache, dass es funktioniert für ein synchroner Befehl ist kein Zufall.InformationsquelleAutor Matthew Flaschen
Stimme ich mit Matthew Flaschen; das problem mit python, die scheinbar nicht registrieren die KeyboardInterrupt-Ausnahme mit SIGINT, wenn es nicht aufgerufen von einer interaktiven shell.
Natürlich, nichts verhindert, dass Sie von der Registrierung Ihrer signal-handler wie diese:
InformationsquelleAutor Michiel Buddingh
Beim ausführen von Befehl im hintergrund mit &, SIGINT, werden ignoriert.
Hier ist der relevante Abschnitt aus man bash:
Ich denke, Sie müssen signal-handler explizit als Matthäus kommentiert.
Skript kill.sh habe auch ein problem. Da loop.py ist geschickt in den hintergrund, es gibt keine Garantie, dass töten läuft nach python loop.py.
InformationsquelleAutor tomoe
Zusätzlich zu @matthew-flaschen, die Antwort, die Sie verwenden können
exec
im bash-Skript, um effektiv zu ersetzen, die den scope des Prozesses geöffnet:bash 4.3.48
auf Ubuntu 16.04.3). Danke!!!Hup, es scheint, dass dies nicht der Fall auf dem Mac. Wird eine follow-up.
InformationsquelleAutor Steen
Versucht @Steen Ansatz, aber ach, es offensichtlich nicht halten auf dem Mac.
Andere Lösung, so ziemlich die gleichen wie die oben, aber ein wenig mehr allgemein zu re-installieren Sie die Standard-handler, wenn
SIGINT
wird ignoriert:InformationsquelleAutor Eric Cousineau