İşlemi öldürmenin zarif yolu


12

Benim bash betiğim selenyum sunucusu ile yapıldıktan sonra, betiği şu şekilde öldürür:

kill `ps -ef | grep selenium | awk '{ print $2 }'`

Bu işe yarar ve selenyum komut dosyasını öldürürken, grep seleniumişlem numarası kill komutuna geri döndüğünde, süreç gitti, bu yüzden bir hata mesajı oluşturuyor. (Başka bir deyişle: iki işlemi öldürür, bunlardan biri gerçek selenyum sunucusudur, diğeri bu komutu nasıl yaptığımın bir yan etkisi olan geçici bir işlemdir.)

Bu istenmeyen yan etkisi olmayan süreci öldürmek için daha zarif bir yol var mı?

(FWIW bir fikrim vardı: bu aynı script senaryoda daha önce selenyum başlar, bu yüzden belki selenyum başlattığımda PID'yi yakalamanın bir yolu olsaydı, bunu saklayabilir ve doğrudan öldürebilirim, Sorun şu ki, bu PID'yi nasıl elde edeceğimi, onu korumak için bir değişkeni nasıl kullanacağımı ve daha sonra komut dosyasında nasıl başvurulacağını bilmiyorum. Ama bu daha iyi bir yol mu?)

Yanıtlar:


12

Kullanmayı deneyin pkill seleniumeğer ne bu, ne de diğerleri biri aşağıdaki gibi başka boru dizisi ile yöntemini kullanmaya devam edebilirsiniz çalışmak

kill `ps -ef|grep -i selenium| grep -v grep| awk '{print $2}'`

pkill bunun için sunucumda çalışmıyor, ancak geliştirilmiş grep şeridiniz çok yardımcı oluyor.
Eric

20

pgrepİlgilendiğiniz komutun PID'sini verecek komutu deneyin .

pgrep selenium

İşlemi gerçekten öldürmek için tamamlayıcı pkillkomutunu kullanın.

pkill selenium

Bunun zarafetini seviyorum ama süreç şöyle görünüyor: "kök 26401 11997 2 23:20 puan / 1 00:00:00 java -jar /home/lm/cron/selenium-server-standalone-2.19.0. jar "yani ben sadece değiştirdim pgrep javave işe yarar :-) teşekkürler!
Eric

2
Eğer pgrep '-f' bayrağını verirseniz, desen tüm komut satırı ile eşleşir. Yani, bu durumda öldürmek pgrep -f seleniumgerekir
mills013

7
kullanmak pkillçok daha basit. pkillile aynı eşleşme ölçütlerini kullanır pgrep, böylece bunu 2 yerine 1 komutunda yapabilirsiniz (ve bir çıktıya güvenmek zorundasınız).
Patrick

7

Kullanmayı deneyin grep [s]elenium. Bu grep sürecini bulamaz.


Bu gerçekten kullanışlı bir numara. Neden çalışıyor?

2
@hesse - grepvarsayılan olarak BRE kullanır. Yani, [ve ]görünmesi argviçin grep, ama bunun nedeni eşleşmeyen [ve ]tarafından tam anlamıyla kullanılmayan grep.
Chris Down

Sık sık | grep -v grepboruda bir bileşen kullandım . Ama bu oldukça zarif ve hoşuma gitti!
Alexios

Geçerli çalışma dizininde, açtığınız işlemle aynı ada sahip bir dosyanız varsa (genellikle) bu yeterli değildir. Yani, normalde kullandığım çözümdür ps -ef | grep \[s]elenium. Bulduğum Gerçi lsofkullanarak için çok daha iyi bir alternatif olması psve grep.
Moreaki

2

killallKomut söz ve bunu repertuarına için yararlı bir ektir hissetmek edilmemiştir.

$ killall selenium

-r regexİşlem adıyla ve hatta bir zaman değeriyle eşleşecek normal bir ifade belirtme seçeneğini de kullanabilirsiniz :

$ killall -o 5m selenium 

5 dakikadan daha eski selenyum işlemlerini öldürür.


Bu, RHEL / CentOS dışı sürümlere özgü gibi görünüyorkillall
ewwhite

0

-m 1Yalnızca ilk bulunan işlemi almak için grep komutuyla anahtarı kullanın . Süreçlerinizi PID'ye göre sıraladığınız sürece, artan şekilde çalışır.


1
Selenyum işleminin daha düşük bir PID kullandığından emin olamazsınız.
FJRA

FJRA, daha önce başlatılan bir işlem her zaman daha düşük PID alır. Selenyum sunucusu 'grep selenium' dan önce başlatıldığı için daha düşük bir PID alacaktır.
hellodanylo
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.