Wie kann ich einen Prozess mit einem Leerzeichen beenden?

8

Ein Prozess mit name = example kann von beendet werden

Killall -9 Beispiel

Wie kann ich mehrere Instanzen des folgenden Befehls beenden, die Leerzeichen enthalten?

"valgrind --tool = lackey ./testcases/kernel/syscalls/waitpid/waitpid03"

Der folgende Befehl gibt valgrind --tool = lackey ./testcases/kernel/syscalls/waitpid/waitpid03 zurück: Keine solche Datei oder kein solches Verzeichnis

killall -9 "valgrind --tool = lackey ./testcases/kernel/syscalls/waitpid/waitpid03"

Usman
quelle
1
Aus den Leerzeichen mit einem \ (Backslash) entkommen?
Daniel Beck
1
killall -9 "valgrind \ --tool = lackey \ ./testcases/kernel/syscalls/waitpid/waitpid03"
Usman
killall -9 valgrind \ --tool = lackey \ ./testcases/kernel/syscalls/waitpid/waitpid03...Beide dieser Befehl funktioniert nicht.
Usman
1
-9ist ein letzter Ausweg. Sie sollten verwenden -SIGTERM, -SIGINToder -SIGQUITder Anwendung zuerst eine Chance zu geben Bereinigung zu tun und anmutig zu verlassen.
Bis auf weiteres angehalten.

Antworten:

8

killall valgrindbeendet alle valgrindProzesse unabhängig von Argumenten. Wenn Sie nur Prozesse beenden möchten, deren Befehlszeile genau ist valgrind --tool=lackey ./testcases/kernel/syscalls/waitpid/waitpid03, können Sie Folgendes verwenden pkill:

pkill -xf 'valgrind --tool=lackey ./testcases/kernel/syscalls/waitpid/waitpid03'

Wie killall, pkillist auf jeder nicht eingebetteten (und einigen eingebetteten) Linux-Installationen, und es ist leistungsfähiger und oft zuverlässiger (aber aus irgendeinem Grund weniger bekannt). Das Companion-Dienstprogramm pgrepist identisch, außer dass es die PIDs auflistet, anstatt sie zu töten.

Ein weiteres Dienstprogramm, an dem Sie interessiert sein könnten, ist fuser: fuser testcases/kernel/syscalls/waitpid/waitpid03Listet die Prozesse auf, bei denen die angegebene Datei geöffnet ist, und fuser -ksendet ein Signal an diese Prozesse. Wenn Sie nicht versuchen, ein Signal zu senden, lsofist dies eine leistungsstärkere Alternative zu fuser(zeigt mehr Material, hat mehr Filter).

Gilles 'SO - hör auf böse zu sein'
quelle
Ihr Beispiel hat bei mir nicht funktioniert, aber das hat funktioniert: pkill -f 'valgrind --tool = lackey ./testcases/kernel/syscalls/waitpid/waitpid03'
JohnMudd
1
@ JohnMudd Du hast recht, danke. Ich bin mir ziemlich sicher, dass ich diese Anführungszeichen einfügen wollte. Der Befehl, den ich gepostet habe, macht keinen Sinn. Auch -fxum "genau mit der Kommandozeile übereinzustimmen".
Gilles 'SO - hör auf böse zu sein'
1

Sie müssen nicht killalldie vollständige Befehlszeile angeben. killall valgrindwäre in deinem Fall ausreichend.

~$ perl -e 'sleep 10000' &
[1] 3586
~$ ps ax | grep perl
 3586 pts/3    S      0:00 perl -e sleep 10000
 3588 pts/3    S+     0:00 grep perl
~$ killall perl
[1]+  Terminated              perl -e 'sleep 10000'
~$ 
Dave Sherohman
quelle
1

Neben den anderen guten Lösungen können Sie htop jederzeit installieren und dann beenden, was Sie möchten, indem Sie durch die Liste der ausgeführten Prozesse scrollen und die Taste F9 (kill) verwenden. Ok, es ist kein hartgesottenes Kommandozeilen-Zeug, aber es funktioniert!

Linker3000
quelle
0

killall valgrindfunktioniert normalerweise nicht, da die eigentliche ausführbare Datei von valgrind einen anderen Namen hat. Dieser Name ist memcheck-amd64-linux oder ähnlich, abhängig davon, welches Valgrind-Tool Sie verwenden. Was ps als Prozessnamen meldet, ist jedoch nicht der ausführbare Name, sondern der erste Eintrag in der Befehlszeile. Dies führt zu Verwirrung. Ich habe dies psmisc gemeldet: https://github.com/acg/psmisc/issues/1

Alexander Torstling
quelle