554 Stimmen

Wie erhalte ich die Prozess-ID eines Hintergrundprozesses?

Ich starte einen Hintergrundprozess aus meinem Shell-Skript und möchte diesen Prozess beenden, wenn mein Skript beendet ist.

Wie bekomme ich die PID dieses Prozesses aus meinem Shell-Skript? Soweit ich sehen kann, ist die Variable $! enthält die PID des aktuellen Skripts, nicht des Hintergrundprozesses.

826voto

camh Punkte 38167

Sie müssen die PID des Hintergrundprozesses speichern, wenn Sie ihn starten:

foo &
FOO_PID=$!
# do other stuff
kill $FOO_PID

Sie können die Auftragssteuerung nicht verwenden, da diese eine interaktive Funktion ist und an ein steuerndes Terminal gebunden ist. An ein Skript ist nicht unbedingt ein Terminal angeschlossen, so dass die Auftragskontrolle nicht unbedingt verfügbar ist.

202voto

jldupont Punkte 87330

Sie können die jobs -l Befehl, um zu einem bestimmten Job zu gelangenL

^Z
[1]+  Stopped                 guard

my_mac:workspace r$ jobs -l
[1]+ 46841 Suspended: 18           guard

In diesem Fall ist die PID 46841.

Von help jobs :

-l Melden Sie die Prozessgruppen-ID und das Arbeitsverzeichnis der Aufträge.

jobs -p ist eine weitere Option, die nur die PIDs anzeigt.

74voto

catwalk Punkte 6028
  • $$ ist die pid des aktuellen Skripts
  • $! ist die PID des letzten Hintergrundprozesses

Hier ist ein Beispiel einer Bash-Sitzung ( %1 bezieht sich auf die Ordnungszahl des Hintergrundprozesses aus der Sicht jobs ):

$ echo $$
3748

$ sleep 100 &
[1] 192

$ echo $!
192

$ kill %1

[1]+  Terminated              sleep 100

38voto

Alexey Polonsky Punkte 1095

Eine noch einfachere Möglichkeit, alle Kindprozesse eines Bash-Skripts zu beenden:

pkill -P $$

があります。 -P Flag funktioniert auf die gleiche Weise mit pkill y pgrep - bekommt er Kindprozesse, nur mit pkill werden die Kindprozesse beendet und mit pgrep Kind-PIDs werden auf stdout ausgegeben.

6voto

Luis Ramirez Punkte 59

Ich habe Folgendes getan. Probieren Sie es aus, ich hoffe, es kann helfen.

#!/bin/bash
#
# So something to show.
echo "UNO" >  UNO.txt
echo "DOS" >  DOS.txt
#
# Initialize Pid List
dPidLst=""
#
# Generate background processes
tail -f UNO.txt&
dPidLst="$dPidLst $!"
tail -f DOS.txt&
dPidLst="$dPidLst $!"
#
# Report process IDs
echo PID=$$
echo dPidLst=$dPidLst
#
# Show process on current shell
ps -f
#
# Start killing background processes from list
for dPid in $dPidLst
do
        echo killing $dPid. Process is still there.
        ps | grep $dPid
        kill $dPid
        ps | grep $dPid
        echo Just ran "'"ps"'" command, $dPid must not show again.
done

Dann führen Sie es einfach als aus: ./bgkill.sh natürlich mit den entsprechenden Erlaubnissen

root@umsstd22 [P]:~# ./bgkill.sh
PID=23757
dPidLst= 23758 23759
UNO
DOS
UID        PID  PPID  C STIME TTY          TIME CMD
root      3937  3935  0 11:07 pts/5    00:00:00 -bash
root     23757  3937  0 11:55 pts/5    00:00:00 /bin/bash ./bgkill.sh
root     23758 23757  0 11:55 pts/5    00:00:00 tail -f UNO.txt
root     23759 23757  0 11:55 pts/5    00:00:00 tail -f DOS.txt
root     23760 23757  0 11:55 pts/5    00:00:00 ps -f
killing 23758. Process is still there.
23758 pts/5    00:00:00 tail
./bgkill.sh: line 24: 23758 Terminated              tail -f UNO.txt
Just ran 'ps' command, 23758 must not show again.
killing 23759. Process is still there.
23759 pts/5    00:00:00 tail
./bgkill.sh: line 24: 23759 Terminated              tail -f DOS.txt
Just ran 'ps' command, 23759 must not show again.
root@umsstd22 [P]:~# ps -f
UID        PID  PPID  C STIME TTY          TIME CMD
root      3937  3935  0 11:07 pts/5    00:00:00 -bash
root     24200  3937  0 11:56 pts/5    00:00:00 ps -f

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X