Bash-Skript zum Finden und Beenden eines Prozesses mit bestimmten Argumenten?

17

Ich möchte ein Skript, das die Instanz (en) beendet, sshdie mit dem Argument -D ausgeführt werden (Einrichten eines lokalen Proxys).

Manuell ps -A | grep -i sshsuche ich die Instanz (en) mit -D und kill -9 {id}jede einzelne.

Aber wie sieht das in Bash-Skript-Form aus?

(Ich arbeite unter Mac OS X, installiere aber alle erforderlichen Befehle über port)

Ricket
quelle
Siehe pgrep und pkill Alternativen auf Mac OS X? . pgrepund pkillsind Befehle zum zuverlässigen Auffinden oder Beenden von Prozessen nach Namen unter Solaris und Linux.
Gilles 'SO- hör auf, böse zu sein'

Antworten:

26

Führen Sie aus, pgrep -f "ssh.*-D"und überprüfen Sie, ob dies die richtige Prozess-ID zurückgibt. Ist dies der Fall, ändern Sie einfach pgrepauf pkillund halten die gleichen Optionen und Muster

Sie sollten auch nicht kill -9aka SIGKILL verwenden, es sei denn, dies ist unbedingt erforderlich, da Programme SIGKILL nicht abfangen können, um vor dem Beenden nach sich selbst aufzuräumen. Ich benutze erst kill -9nach dem ersten Versuch -1 -2und -3.

SiegeX
quelle
du solltest kill als eine forSchleife definieren, die es kill -ifür jeden tut i;)
Seamus
1
pgrepist unter OSX nicht nativ, Sie müssen es von einem Drittanbieter beziehen. Der vorherige Thread zum Thema enthält Vorschläge und Alternativen.
Gilles 'SO- hör auf böse zu sein'
man alive, je mehr ich 'nix benutze, desto mehr liebe ich es :) danke dafür!
javamonkey79
pgrep und pkill sind in OS X 10.8 (Mountain Lion) und höher verfügbar. apple.blogoverflow.com/2012/07/…
Peter Hanley
Es kann nützlich sein, das -aFlag hinzuzufügen, zu pgrepdem nicht nur die Prozess-ID, sondern auch der Befehl (einschließlich der Argumente) gedruckt werden soll. Auf diese Weise kann sehr einfach überprüft werden, ob nur die gewünschten Prozesse übereinstimmen.
Luator
1

Ebenfalls,

kill `pgrep -f "ssh.*-D"`
Barun
quelle
3
Ich denke, das entsprichtpkill
Michael Mrozek
0

Sie können das proc-Dateisystem nutzen, um die Informationen zu sammeln. Beispielsweise:

for proc in $(grep -irl "ssh.*-D" /proc/*/cmdline | grep -v "self"); do if [ -f $proc ]; then cat $proc && echo ""; fi; done

Es ist nicht perfekt, Sie möchten einen exklusiveren regulären Ausdruck (insbesondere, wenn Sie Prozesse beenden), echo $proc | awk -F'/' '{ print $3 }'zeigen Ihnen jedoch die PID der Prozesse.

Tok
quelle
1
OSX hat nicht /proc. Und dafür gibt es bereits ein robustes Tool namens pgrep(zumindest unter Solaris und Linux nativ verfügbar).
Gilles 'SO- hör auf böse zu sein'