Bir işlemi PID yerine adıyla nasıl öldürebilirim?


349

Bazen Firefox'u başlatmaya çalıştığımda "Bir Firefox işlemi zaten çalışıyor" yazıyor. Bu yüzden bunu yapmak zorundayım:

jeremy@jeremy-desktop:~$ ps aux | grep firefox
jeremy    7451 25.0 27.4 170536 65680 ?        Sl   22:39   1:18 /usr/lib/firefox-3.0.1/firefox
jeremy    7578  0.0  0.3   3004   768 pts/0    S+   22:44   0:00 grep firefox
jeremy@jeremy-desktop:~$ kill 7451

İstediğim her şeyi benim için yapacak bir komut. Bir giriş dizesi alır ve grepbunun için (ya da her ne olursa olsun) süreçler listesinde olur ve çıktıdaki tüm süreçleri öldürür:

jeremy@jeremy-desktop:~$ killbyname firefox

Ben PHP bunu yapmayı denedim ama exec('ps aux')sadece exec()PHP betiği kendisi ile yürütülen işlemleri göstermek gibi görünüyor (bu yüzden tek işlem kendisi olduğunu.)


Firefox'un zaten çalıştığını söyleyen pencereyi aldığımda genellikle sadece bir saniye beklemek zorundayım ve Firefox'u tekrar çalıştırabilirim (elbette her zaman böyle olmayabilir).
nuoritoveri

1
JohnB'nin bu cevapta söylediği gibi en güvenli yol budur: stackoverflow.com/questions/6381229/…
tecnoshopbq


Bu eski bir soru, ama kabul edilen cevabı değiştirebilir misiniz? İşaretlediğiniz JVM tarafından çalıştırılanlar gibi birçok işlemde başarısız olur.
Luís de Sousa

Bu konuya atıfta bulunan herkes için, yukarıdaki yorumda Luis, aşağıdaki cevabı veren aşağıdaki cevaba atıfta bulunuyor pkill -f "Process name"...
Digger

Yanıtlar:


505

7
Öldürme işlemlerine başlamadan önce ne öldürdüğünüzü bulmak için pgrep kullanmak iyi bir şeydir. Özellikle kullanırken -f.
Akrikos

pkill çok kolay değil. killall onları alır aynı şekilde isimleri veremezsiniz.
Ahtapot

2
pkill -U <username>oldukça kullanışlıdır. Bir Solaris web sunucum var, gerçek web sunucusu arka plan programı, kendi kullanıcısıyla bir Hizmet olarak kuruluyor . Yani kullanıcı tarafından belirtmek, yeniden başlatmayı tetiklemenin basit / kolay bir yoludur.
Raystorm

6
Öldürmek için: pkill -9 firefox
Justas

Bu en iyi yarı yarıya çalışır. -fOmnibus çözümü için en azından bayrağa ihtiyacınız var .
Luís de Sousa

112

Ayrıca kullanmak mümkündür:

pkill -f "Process name"

Benim için mükemmel çalıştı. Aradığım şey buydu. pkill bayrak olmadan isimle çalışmaz.

Ayarlandığında -f, desen eşleşmesi için tam komut satırı kullanılır.


2
özellikle şarap ile bir şey çalıştırmak için -fseçenek gerçekten gereklidir. ör.pkill -f "EvilWindowsServer.exe"
CodeBrauer

Bu kabul edilen cevap olmalı. İlk cevap, bir JVM'de çalışanlar gibi birçok programda başarısız olur.
Luís de Sousa

1
Ben de -fbir Python komut dosyası çalıştıran bir arka plan işlemi öldürmek için bayrak eklemek zorunda kaldı .
Mason

benim durumumda, 2 bayrak ihtiyacım vardı:pkill -f -9 PROCESSNAME
Slavik

64

Sen tarafından süreçlerini öldürebilir adıyla birliktekillall <name>

killall , belirtilen komutlardan herhangi birini çalıştıran tüm işlemlere bir sinyal gönderir. Hiçbir sinyal adı belirtilmezse, SIGTERM gönderilir.

Sinyaller ada göre (örn. -HUP veya -SIGHUP ) veya sayıya göre (örneğin -1 ) veya -s seçeneği ile belirtilebilir .

Komut adı normal ifade değilse (seçenek -r ) ve eğik çizgi (/) içeriyorsa, bu dosyayı yürüten işlemler, adlarından bağımsız olarak öldürme için seçilir.

Ama eğer süreci görmüyorsanız, ps auxmuhtemelen onu öldürme hakkınız olmayacaktır ...


6
Yanıt vermeyen bir programı sonlandırmaya zorlamak için TERM yerine KILL gönderin:killall -s KILL firefox
Martin Hansen

45

Biraz daha uzun bir alternatif:

kill `pidof firefox`

25
firefox pidof'u | xargs kill -9
hbt

1
Bu, gömülü aygıtlarınız için
meşgul kutusu

25

Bunu yapmanın en kolay yolu, önce doğru işlem kimliklerini alıp almadığınızı kontrol etmektir:

pgrep -f [part_of_a_command]

Sonuç beklendiği gibi ise. İle git:

pkill -f [part_of_a_command]

19

Garip, ama böyle bir çözüm görmedim:

kill -9 `pidof firefox`

ayrıca aşağıdaki gibi birden çok işlemi (çoklu pids) öldürebilir:

kill -9 `pgrep firefox`

pidofTek satır çıktısı olduğundan tercih ederim :

> pgrep firefox
6316
6565
> pidof firefox
6565 6316

Bunu yürüttüğümde hatayı aldım kill: invalid number 'pidof myprogram'. Burada kötü olan ne?
Brethlosze

Bu bugün hayatımı kurtardı ... Daha fazla yazmak istemiyorum ama burada bulduğuma sevindim. teşekkürler dostum.
MilMike

1
Geç geliyor ama bir başkasının merak etmesi durumunda… @Brethlosze tek keneler koyarken, komut geri çekilmeye ihtiyaç duyar.
spektrumlar

Teşekkürler! .. Bu backticks farkında olacağım (ve ben olmak) :)
Brethlosze

14

snippetBaşlangıç ​​yolundaki tüm işlemleri öldürün . Parçacık olarak / directory / koyarak bir dizinden başlatılan tüm uygulamaları öldürebilirsiniz. Aynı uygulama dizininden aynı uygulama için birkaç bileşen başlattığınızda bu oldukça kullanışlıdır.

ps ax | grep <snippet> | grep -v grep | awk '{print $1}' | xargs kill

* Varsa pgrep tercih ederim


1
Bu sık görülen karşıtlık kombinasyonudur. Kendisiyle (veya içeren komut dosyasının adıyla) eşleşmeyen bir normal ifade kullanın ve işe yaramazgrep .ps ax | awk '/[s]nippet/ { print $1 }' | xargs kill
tripleee

1
yararsız grep kaçınarak yazım hataları kaçının ve komutu <snippet> parametreleştirilmiş otomatik süreçlerde kullanma yeteneği
Mike

BU gerçekten bunu yapmanın en iyi yolu!
Abhinandan Dubey

@ Tripleee'nin neden [s]awk sürecinin kendisiyle eşleşmemesi açısından çalıştığını anlamak harika olur mu?
andig

Çünkü normal ifade [x]ydize ile eşleşir xyancak tersi değildir. Bu yaygın bir SSS'dir. Bağlantı, 20 yıldan uzun bir süre önce bu konuyu daha ayrıntılı olarak açıklayan bir sayfadır; ve bu o zamanlar tekrar eden bir soruydu.
tripleee

11

Mac üzerinde ne bu kadar basit bir liner betiği yazdı pgrep ve pkill killall çalışma bulamadı: -

export pid=`ps | grep process_name | awk 'NR==1{print $1}' | cut -d' ' -f1`;kill $pid

Bunu yapmanın daha kolay bir yolu varsa lütfen paylaşın.


1
Lol. Bu böyle bir göreve deli bir emirdir. Boşver. Buna basit bir satır mı dediniz? : D Simple is killall
m3nda

@ erm3nda :-) Kabul et. Geriye dönüp baktığımda çılgınca görünüyor. O zaman killall'ın mac'umda neden çalışmadığını hatırlayamıyorum.
Dhiraj

Bu, "jboss" gibi belirli bir Java işlemini öldürmek istediğinizde çok kullanışlıdır. Bu durumda killall yardımcı olmaz.
Jan M


6

Grep ile öldürmek için:

kill -9 `pgrep myprocess`

5

daha doğru olurdu:

export pid=`ps aux | grep process_name | awk 'NR==1{print $2}' | cut -d' ' -f1`;kill -9 $pid

1
Neden exportaynı işlemde sadece bir kez kullanacağınız bir değişken kullanıyorsunuz?
tripleee


3

Ben kendime aynı soruyu soruyordu ancak mevcut cevapları ile sorun onlar değil ki işlemler sonlandırılacak güvenli çek o korkunç hatalara yol açabilir ... bu yüzden: özellikle ...) çeşitli işlemler modeliyle eşleştiği .

Bir feragatname olarak, ben bir sh pro değilim ve kesinlikle iyileştirilmesi için yer var.

Bu yüzden küçük bir sh senaryosu yazdım:

#!/bin/sh

killables=$(ps aux | grep $1 | grep -v mykill | grep -v grep)
if [ ! "${killables}" = "" ]
then
  echo "You are going to kill some process:"
  echo "${killables}"
else
  echo "No process with the pattern $1 found."
  return
fi
echo -n "Is it ok?(Y/N)"
read input
if [ "$input" = "Y" ]
then
  for pid in $(echo "${killables}" | awk '{print $2}')
  do
    echo killing $pid "..."
    kill $pid 
    echo $pid killed
  done
fi

2

GNOME çalıştırıyorsanız, işlemleri Windows altında yaptığınız gibi öldürmek için sistem monitörünü (Sistem-> Yönetim-> Sistem Monitörü) kullanabilirsiniz. KDE'de benzer bir şey olacak.


2

Varsayılan killkomut, komut adlarını PID'ye alternatif olarak kabul eder. Bkz. Öldürme (1) . Sık karşılaşılan bir sorun, komut adlarını beğenen, ancak olmayan iş numaralarını kabul eden bashkendi sorununu sağlar . Bu, varsayılan komutu engeller. Eski işlevler sizin için önceki işlevlerden daha faydalıysa, arayarak sürümü devre dışı bırakabilirsiniz.killkill %1bash

enable -n kill

Daha fazla bilgi için bkz killve enablegirişlerin bash (1) .


Yaptığım eylemi nasıl yeniden etkinleştirebilirim enable -n kill?
Brethlosze

1
@hyprfrcbenable kill
The Vee



0

psÇıktı başlığını ayrıştıran awk oneliner, bu nedenle sütun numaralarını (ancak sütun adlarını) önemsemeniz gerekmez. Normal ifadeyi destekleyin. Örneğin, çalıştırılabilir adın (yol olmadan) "firefox" kelimesini içeren tüm işlemleri öldürmek için

ps -fe | awk 'NR==1{for (i=1; i<=NF; i++) {if ($i=="COMMAND") Ncmd=i; else if ($i=="PID") Npid=i} if (!Ncmd || !Npid) {print "wrong or no header" > "/dev/stderr"; exit} }$Ncmd~"/"name"$"{print "killing "$Ncmd" with PID " $Npid; system("kill "$Npid)}' name=.*firefox.*
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.