Die ID eines Prozesses finden und ihn beenden

16

Wann immer ich einen Hintergrundprozess beenden muss, tue ich das ps -e | grep <process_name>

Was soetwas druckt 1766 ? 00:00:13 conky, dann benutze ich die Prozess-ID dazu killso kill 1766.

Kann ich das auf irgendeine Weise vereinfachen? Mach es schneller? die Anzahl der Eingaben reduzieren?

Gautam
quelle
1
Ich habe die Antwort erhalten, die ich möchte, aber ich werde eine Weile warten, bevor ich akzeptiere, damit die Community von den verschiedenen verfügbaren Optionen profitieren kann.
Gautam
Bitte zögern Sie nicht, diese Frage allgemeiner zu formulieren, damit mehr Menschen von den Antworten profitieren können
Gautam,

Antworten:

18

(TL, DR: pgrep, pkill)

Viele Unix - Varianten kamen mit dem pgrepund seinen Begleitern pkill: Solaris , Linux (Teil des Standard - Prozess Dienstprogramme kann von Embedded - Linux - Systemen fehlen), FreeBSD , OpenBSD , NetBSD , ... aber nur von MacPorts auf OS X , nicht AIX , und nur vor kurzem in HP-UX . Das pgrepDienstprogramm zeigt die Prozess-ID von Prozessen an, die nach Name, Benutzer und einigen anderen Kriterien übereinstimmen. Das Argument pgrepwird als regulärer Ausdruck interpretiert , dass ein Teil des Prozesses der ausführbaren Namen (es sei denn Sie eine Option übergeben , um dies zu ändern) müssen übereinstimmen. Wenn Sie rufen pkillstattpgrepsendet das Dienstprogramm ein Signal, anstatt die Prozess-IDs anzuzeigen.

Ein weiteres ähnliches Dienstprogramm ist pidof . Unter Linux wird es von SysVinit oder BusyBox bereitgestellt (daher finden Sie es häufig auf einem eingebetteten Linux-System ohne pgrep). es gibt auch ports auf anderen unix varianten. Das pidofDienstprogramm verfügt über weniger Optionen, es stimmt meist nur mit vollständigen Namen der ausführbaren Dateien überein. Das zugehörige Dienstprogramm killallsendet ein Signal an die entsprechenden Programme¹.

¹ Beachten Sie, dass dies killallunter Solaris und möglicherweise anderen Unix-Varianten eine andere Bedeutung hat. killallGeben Sie unter Solaris nicht als root ein.

Gilles 'SO - hör auf böse zu sein'
quelle
Wow deine Antwort ist sehr detailliert, viel ausführlicher, danke. Bitte passen Sie die Frage nach Möglichkeit an die Antwort an.
Gautam
@GautamK Ich glaube nicht, dass die Frage erweitert werden muss. Wenn Sie dies tun, können Sie es gerne selbst bearbeiten.
Gilles 'SO- hör auf böse zu sein'
Von den Antworten mit der meisten Stimmenzahl Ihre Antwort gibt mehr Details, also akzeptiere ich es
Gautam
8
  • killall ProcessName (Dieser Befehl hat den Nachteil, dass Sie den Prozessnamen eines Programms nicht immer kennen.)
  • pidof ProccessName und kill the result form pidof
  • ps xu | grep <process name> | grep -v grep | awk '{ print $2 }' | xargs kill -9 Probieren Sie diese eine Zeile aus und verwenden Sie sie aus dem Verlauf Ihrer Bash wieder, oder erstellen Sie besser einen Alias ​​dafür.
Hanan N.
quelle
Die zweite pidofscheint ein bisschen einfacher, aber es
dauert
Ich kann einen einzeiligen Befehl suchen / erstellen, der dies in einem Schritt erledigt (mit einem groben Prozessnamen), aber dafür müssten Sie eine lange Zeile eingeben (was schwieriger ist als die beiden obigen Schritte), oder Sie könnten es einmal eingeben und wiederverwenden Sie es aus der Geschichte.
Hanan N.
@GautamK Ich habe die Antwort mit der Option "Einzelbefehl" aktualisiert.
Hanan N.
6

Während Hanan einige gute Vorschläge hat, werde ich hinzufügen pgrep/ pkill. Sie ermöglichen eine genauere Kontrolle darüber, welchen Prozess Sie finden, und reguläre Ausdrücke, wenn Sie den genauen Prozess nicht kennen, den Sie zum Beenden benötigen.

PS Hanans pidofkönnen killdirekt mit Backticks gefüttert werden:

kill `pidof processname`
Kevin
quelle
pkillwar genau das, wonach ich gesucht habe, ich kenne die meiste Zeit den Prozessnamen, meistens das conkyoder firefoxoder chromeoder so ähnlich. Vielen Dank
Gautam
1

Wie wäre es damit -

ps -e | awk '$4~/<process name>/{print $1}' | xargs kill

Beispiel:

[jaypal:~/Temp] sleep 100&
[1] 74863
[jaypal:~/Temp] ps -e | awk '$4~/sleep/{print $1}' | xargs kill
[1]+  Terminated: 15          sleep 100

Aktualisieren:

Leider ist diese nicht erfüllt offenbar nicht die Anforderung von weniger Typisierung so ein guter Weg , es zu tun wäre hinzuzufügen , ein functionzu Ihrem .bashrc, .profileoder was auch immer dem Startskript. Die Funktion kann so etwas sein -

killp() {
awk -v pname="$1" '($4==pname){print $1}' <(ps -e) | xargs kill
}

Nach dem Hinzufügen können Sie einfach den Namen Ihres Prozesses übergeben:

[jaypal:~] sleep 100&
[1] 77212
[jaypal:~] killp sleep
[1]+  Terminated: 15          sleep 100
Jaypal Singh
quelle