Sadece süreç devam ediyorsa nasıl öldürülür?


14

Şu anda benim sh komut dosyasında böyle bir çizgi kullanın:

kill `ps aux | grep -F 'myServer' | grep -v -F 'grep' | awk '{ print $2 }'` 

Ama bunu sadece süreç ( myServerburada) çalışıyorsa nasıl arayacağımı merak ediyorum ?


killsadece süreç çalışırken aramak imkansızdır , çünkü test ile çağrılma arasında bir yarış durumu vardır kill(bu kısa sürede başka bir nedenden dolayı işlemin durması mümkündür). Kullanmaya çalıştığınız pkillveya killalltam olarak aynı şeyi yapmalısınız, ancak yazması daha az olan (ve muhtemelen başka avantajlar da).
JanC

Yanıtlar:


20

Genellikle sadece pgrep ve pkill kullanıyorum

if pgrep myServer; then pkill myServer; fi

7
Neden olmasın pkill myServerya da killall -q myServer? Varolmayan süreçleri öldürmeye çalışmanın bir dezavantajı yoktur.
David Foerster

12
Öldürmek için bir süreç yoksa 0'dan çıkmayacaktır, bu yüzden komut dosyalarını bozabilir.
boutch55555

6
|| trueSonra ekleyin .
David Foerster

Doğru, ancak sürecin zaten öldüğünü size bildirmek için başka bir ekleme esnekliğine sahip olmayacaksınız.
boutch55555

Ne olmuş if ! killall -q myServer; then echo ERROR; fi?
David Foerster

9

İşlemleri pkillveya kullanarak ada göre öldürebilir killall, man sayfalarını kontrol edebilirsiniz.


evet, aksine kill, bu sadece süreç çalışıyorsa öldürür. Örneğinpkill -u myuser -f myprocess\.[0-9]+
Chase

6

Biraz farklı bir yaklaşım şöyle olabilir:

killall PROCESS || echo "Process was not running."

Bu işlem yoksa, komuttan 1döndürülen Hata Kodunu önler killall. echoKısım halinde, eyleme gelecek killallgetiri 1kendisi dönecektir ederken, 0(başarılı).


5
Kullanmak killall -qdaha iyidir
Anwar

1
Uyarı, killall -qtüm unix lezzetlerinde desteklenmez, macOS Catalina hala sahip değil.
tresf

0

kullanmayı deneyin:

sudo kill `pidof process_name`

Burada process_name, öldürmek istediğiniz sürecin adıdır. Bu konuda harika olan, pidof'un verilen adla eşleşen tüm işlemlerin pid'lerini listeleyecek olmasıdır. Kill çoklu pidleri kabul ettiğinden, hepsini tek bir hevesle öldürecektir.

Bunun yardımcı olup olmadığını bana bildirin.


Liste boşsa ne olur? (benim asıl
amacım

1
Liste boşsa kill, bir hata kodu 1 döndürür ve hiçbir şeyi öldürmez. Bu, argüman olmadan kill çağrısı yapmaya eşdeğerdir. Önce pidof boş bir liste döndürüp döndürmediğini kontrol eden bir if ifadesi ekleyebilirsiniz. Boş bir liste döndürmezse, arayın kill `pidof process_name. Boş bir liste döndürürse, kill çağrısını atlayın.
amandion

0

Ar-Ge ile oluşturduğum Küçük Senaryo. umarım beğenirsin

#!/bin/bash

echo " Enter the process name:"
read $proc_name
if pgrep $proc_name
then
echo " $proc_name running "
pkill $proc_name
echo "$proc_name  got killed"
else
echo " $proc_name is not running/stopped "
fi

script.sh gibi bir adla kaydedin

chmod +x script.sh
./script.sh

Ardından işleminizin adını verin.

Not: Bu ve para cezası ile birçok kez denedim.


Bu senaryo ile neyin yanlış olduğunu bilebilir miyim ve -ve oy bir açıklama gerekiyor lütfen.
rɑːdʒɑ

Bu komut dosyasında yanlış bir şey yok ... +1
WinEunuuchs2Unix

0

Sürecin mevcut olup olmadığını kontrol edin pidof. Varsa öldürün:

(! pidof process_name) || sudo kill -9 $(pidof process_name)

Yukarıdaki komut yürütüldükten sonra çıkış kodu her zaman 0'dır.


0

pkillSeçenekle birlikte kullan-f

pkill -f myServer

Seçenek -f, normalde işlem adıyla eşleşen desendir.


-1

Kullanmak istiyorum:

ps x --no-header -o pid,cmd | awk '!/awk/&&/myServer/{print $1}' | xargs -r kill

xargs -rGiriş yoktur, sadece öldürmek çalıştırmak için söyler. ps --no-header -eo pid,cmdAyrıştırma için daha iyi bir biçime çıktısını alır.

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.