Shell-Skript für -9 kill basierend auf dem Namen

28

Gibt es eine Möglichkeit (möglicherweise ein Skript), diesen Prozess zu automatisieren:

petr@sova:~$ ps -ef | grep middleman
petr     18445  2312  1 12:06 pts/2    00:00:01 /home/petr/.rvm/gems/ruby-1.9.3-p362/bin/middleman                                                                  
petr     18581 13621  0 12:08 pts/0    00:00:00 grep --color=auto middleman
petr@sova:~$ kill -9 18445

Leider pkillist mir das zu schwach, da ich mit -9Option weiter machen muss kill.

mreq
quelle
2
Sie können -9mit pkillauch verwenden ...
Stop Harming Monica
6
Meiner Meinung nach ist es eleganter und zweckmäßiger zu bedienen -KILLals -9. Welche Zahl welchem ​​Signal entspricht, ist implementierungsabhängig. SIGKILLzufällig 9auf Linux i386 und Linux amd64, aber nicht unbedingt überall. ( Mehr Infos hier. )
Eliah Kagan
5
@EliahKagan: Während Ich mag die Verwendung -KILLauch (weil es Code besser lesbar macht), ist zu beachten, dass SIGKILL = 9sich durch POSIX spezifiziert , so -9ziemlich tragbar ist heutzutage (und hängt nicht von Kernel oder Architekturen).
Andrea Corbellini

Antworten:

36

Sie können Ihre Shell verwenden, um diese Aufgabe für Sie zu erledigen:

kill -9 $(pidof middleman)

Die Shell führt zuerst den Befehl aus pidof middleman. Die Ausgabe von pidof (8) ist die Prozess-ID. Daher ersetzt die Shell den pidofBefehl -c durch die Prozess-ID und führt sie aus kill -9 18845(oder wie auch immer die korrekte Prozess-ID lautet).

qbi
quelle
Was ist der Unterschied zwischen diesem und kill -9 $(pgrep middleman)?
Aaron Franke
54

Es gibt eine noch einfachere Lösung als die von qbi: killallSie können Prozesse mit Namen beenden und Signale angeben.

killall -9 middleman

Sehen Sie man killallfür weitere Informationen und zusätzliche Optionen (es gibt nicht wenige).

Wie der Name schon sagt, sendet dies das Signal an alle genannten Prozesse middleman. Aber das unterscheidet sich nicht von anderen Möglichkeiten (wie pkill). Darüber hinaus pkill -9 middlemanwerden auf Prozesse abgezielt, deren Name zwar übereinstimmt, jedoch nicht identisch ist middleman, z middleman2. B. auch.

Gerhard Burger
quelle
2
killallfür den Sieg!
Andrea Corbellini
4
Alle Zwischenhändler töten? oh je ...
Tobias Kienzler
16

Die anderen Antworten sind völlig richtig, aber ich könnte genauso gut eine dritte Option hinzufügen, damit alle hier dokumentiert sind. Sie können auch verwenden:

pkill -9 middleman

Sehen Sie man pkillfür weitere Informationen und zusätzliche Optionen.

Es spielt keine Rolle, welche dieser Methoden Sie verwenden. Sie werden alle funktionieren. Das Kennen der Optionen ist jedoch hilfreich, wenn Sie das Verhalten auf irgendeine Weise ändern möchten, da auf den entsprechenden Manpages angezeigt wird, welche anderen Übereinstimmungsoptionen verfügbar sind.

Robie Basak
quelle
Seltsam, funktioniert hier nicht. Auch nichtmiddleman*
mreq
1
Ah. Wenn Sie genauer hinschauen, ist es wahrscheinlich, dass Sie einen Ruby-Interpreter töten möchten, anstatt einen Prozess, der wirklich aufgerufen wird middleman. Hier werden die Unterschiede, wie genau pkill, killall, pidofund grepMatch Prozesse wirklich zu Materie beginnen!
Robie Basak
12
pkill -9 -f middleman

Mit dieser -fOption wird die Übereinstimmung mit der gesamten Befehlszeile und nicht nur mit dem Prozessnamen hergestellt.

Beachten Sie, dass -9dies ein Signal für den letzten Ausweg sein sollte, das nicht routinemäßig verwendet werden sollte.

jlliagre
quelle
1
Vielen Dank! Ich mag die Fähigkeit wirklich, dascomplete command line
cwd
komplette Kommandozeile ist echt cool!
Okwap
10

Nur zum Spaß möchte ich eine manuellere, altmodischere Art hinzufügen

kill -9 `ps aux | grep middleman | awk '{print $2}'`
Slipset
quelle
1
Ich habe das vor ein paar Jahren bei der Arbeit gemacht und der Administrator sah mich mit einem Blick an, der "Okay, Opa" lautete. Sie können auch ein grep -v grep vor dem awk einfügen, um sicherzustellen, dass der grep-Befehl nicht ebenfalls beendet wird.
Iain Holder
@gerhard, danke für die Bearbeitung, konnte die Back Ticks auf meinem iPad nicht finden. grep -v ist eine gute Idee ...
Slipset
Der echte Weg der alten Schule wäre, zu schreiben ... grep [m]iddleman ..., um zu vermeiden, dass der grepProzess versehentlich beendet wird. Auf diese Weise kann sich das Grep aufgrund von witzigen Zitaten nicht anpassen.
Mikko Rantalainen
1
killall -9 -ir regex_pattern

Dies ist interaktiv (sicher) und entspricht dem Teilbefehlsnamen.

Bohr
quelle