Bir nohup işlemini öldürmek için işlem kimliğini nasıl edinebilirim?


204

Sunucuda nohup işlemi yürütüyorum. Onu öldürmeye çalıştığımda macun konsolum kapanıyor.

süreç kimliğini nasıl bulmaya çalışacağım:

ps -ef |grep nohup 

bu öldürme emri

 kill -9 1787 787

6
Bir komut dosyasından mı yoksa komut satırından mı öldürmeye çalışıyorsunuz? Bunu yaparken PID'yi kaydetmeniz nohupve daha sonra için kullanmanız killveya ps -efçıktıdaki komut adına göre işlemi bulmanız ve PID'yi bundan almanız gerekir. Komut adını aramalısınız, değil nohup.
Gizemli

1
@mbratch Bunu bir yorum yerine bir cevap vermelisiniz.
Ansgar Wiechers

@AnsgarWiechers öneri için teşekkürler. Bazen cevabım çok kısaysa veya OP'nin ne istediğini tam olarak kapsadığından emin değilseniz, cevap olarak göndermekten çekinmeyin. Bir cevap ekledim ve daha fazla bilgi ekledim.
Gizemli

Yanıtlar:


355

Kullanırken nohupve görevi arka plana koyduğunuzda, arka plan operatörü ( &) komut isteminde size PID değerini verecektir. Planınız işlemi manuel olarak yönetmekse, bu PID'yi kaydedebilir ve daha sonra gerekirse kill PIDveya yoluyla kill -9 PID(öldürmeye zorlamanız gerekiyorsa) işlemi öldürmek için kullanabilirsiniz . Alternatif olarak, PID'yi daha sonra bulabilir ve PID'yi ps -ef | grep "command name"oradan bulabilirsiniz. nohupAnahtar kelime / komutun kendisinin pssöz konusu komutun çıktısında görünmediğini unutmayın .

Bir komut dosyası kullandıysanız, aşağıdakine benzer bir şey yapabilirsiniz:

nohup my_command > my.log 2>&1 &
echo $! > save_pid.txt

Bu, my_commandtüm çıktıların kaydedilmesini çalıştıracaktır my.log(bir komut dosyasında, $!yürütülen son işlemin PID'sini temsil eder). 2Standart hata için dosya tanıtıcısı (olan stderr) ve 2>&1standart çıktı (dosya tanımlayıcı yönlendirmek standart hata çıktısına kabuk söyler 1). O gerektirir &1kabuk yerine adında bir dosyanın bu bağlamda bir dosya tanıtıcı biliyor ki 1. 2>&1Normalde bizim içine standart hata yazılır ki tüm hata iletilerini yakalamak için gerekli olan my.log(standart çıkışından geliyor) dosyası. Kabuk ile G / Ç yönlendirmesini yönetme hakkında daha fazla bilgi için G / Ç Yeniden Yönlendirme konusuna bakın .

Komut çıkışı düzenli olarak gönderirse, çıkışı zaman zaman kontrol edebilir tail my.logveya takip etmek isterseniz "live" kullanabilirsiniz tail -f my.log. Son olarak, süreci öldürmeniz gerekiyorsa, bunu şu şekilde yapabilirsiniz:

kill -9 `cat save_pid.txt`
rm save_pid.txt

15
nohupPID'yi basan hafif bir açıklama, kendiliğinden değil, &arka planın son ls &ls
halidir

1
'2> & 1' ne yapar?
Viraj

4
@Viraj 2"standart hata" dosya tanımlayıcısıdır. >kabuk yeniden yönlendirme ve &1"standart çıktı" dosya tanımlayıcı ( &kabuk burada adında bir dosyaya atıfta olduğumu düşünmez bu yüzden burada gereklidir 1). Böylece 2 > &1herhangi bir standart hata çıkışını standart girişe yönlendirir. > my.logStandart çıktıyı yönlendirmek için önceki araçlar my.logolduğundan, hata mesajlarının da gitmesini sağlamak için bir yola ihtiyacımız var my.log. 2 > &1bu tür hataların standart çıktıya gitmesini sağlar ve bu da gider my.log. Bkz. G / Ç Yönlendirme .
lurker

6
echo $!ortaya çıkan süreç yerine nohup pid'ini veriyor: paste.fedoraproject.org/428697/99695314
Nehal J Wani

1
@Mvorisek &bir komut sınırlayıcı görevi görür, böylece deneyebilirsiniz sh -c "nohup my_command > my.log 2>&1 & echo $! > save_pid.txt". Çalışabilir, ama denemedim.
lurker

92

Bir VPS sunucusunda (ve SSH - macun aracılığıyla) kırmızı şapka linux kullanıyorum, benim için aşağıdakiler çalıştı:

İlk olarak, çalışan tüm işlemleri listelersiniz:

ps -ef

Sonra ilk sütunda kullanıcı adınızı bulacaksınız; Aşağıdaki üç kez buldum:

  • Biri SSH bağlantısıydı
  • İkincisi bir FTP bağlantısıydı
  • Sonuncusu nohup süreciydi

Sonra ikinci sütunda nohup işleminin PID'sini bulabilirsiniz ve sadece şunu yazabilirsiniz:

kill PID 

(PID'nin nohup işleminin PID'si ile değiştirilmesi elbette)

Ve işte bu!

Umarım bu cevap bash ve SSH için çok yeni olduğum biri için yararlı olacaktır, ancak burada ihtiyacım olan bilginin% 95'ini buldum :)


3
Sanırım burada UID yerine PID mi demek istediniz?
wprins

@ Wprins ile aynı fikirdeyim. UID'yi öldürmek benim için işe yaramadı, ancak PID'yi öldürmek işe yaradı.
Ryan

Benim durumumda nohup ile bir test kabuğu betiği (long_running_script.sh) çalıştırdım ve & ve dint bunu nasıl durduracağını biliyorum. Sonunda, bir ps -ef yaptım | grep long_running * ve PID'yi buldum. Sonra bir öldürme PID yaptı
Rennish Joseph

50

aşağıdaki komutla arka planda yakut komut dosyası çalıştırdığımı varsayalım

nohup ruby script.rb &

sonra komut adını belirterek yukarıdaki arka plan işlemi pid alabilirsiniz. Benim durumumda komut yakuttur.

ps -ef | grep ruby

çıktı

ubuntu   25938 25742  0 05:16 pts/0    00:00:00 ruby test.rb

Artık kill komutunu kullanarak işlemi kolayca öldürebilirsiniz

kill 25938

1
Sanjay, bir şey eksik olmadığımdan eminim, cevabınızın hangi kısmı yeni veya yıllar önce verilen cevaplardan farklı? ps -efve killikisi de yukarıda iyice kaplanmıştı, peki yeni kısım nedir?
David C. Rankin

2
ps -ef size uzun bir çıkış listesi verecek ve bu uzun listeden arama yapmak zor olacaktır. bu yüzden ps -ef düşünüyorum | grep ruby ​​pid aramak için daha iyi bir komut sadece ps -ef yapmaktan daha iyidir
Sanjay Salunkhe

20

jobs -l size nohup işlemleri listesi için bir pid vermelidir. onları nazikçe öldür (-9). ;)


11
Yalnızca iş geçerli kabukta başlatıldıysa. Ve kill -9normal sinyallerin çalışmadığını bilmedikçe yapmayın.
tripleee

1
PS'nin

5

Deneyebilirsin

kill -9 `pgrep [command name]`

2
çok hoş! Kullandığım pkill [command name]kullanabileceğiniz -oen eski eşleştirme işlemini öldürmek için bayrak veya -nyerine yeni birini kullanmak.
zanona

4

Bu çalışıyor Ubuntu

Bunu bulmak için şunu yazın PID

ps aux | grep java

Java ile ilgili tüm çalışma süreci gösterilecektir

Benim durumumda

johnjoe      3315  9.1  4.0 1465240 335728 ?      Sl   09:42   3:19 java -jar batch.jar

Şimdi öldür kill -9 3315

Zombi süreci sonunda durdu.


4

Nohup ile bir java programı yürüttüğünüzü varsayalım tarafından java işlem kimliği alabilirsiniz

`ps aux | grep java`

çıktı

xxxxx     9643  0.0  0.0  14232   968 pts/2   

o zaman yazarak işlemi öldürebilirsiniz

sudo kill 9643

veya diyelim ki tüm java süreçlerini öldürmeniz gerekiyor

sudo killall java

bu komut tüm java işlemcilerini öldürür. bunu işlemle kullanabilirsiniz. sadece komutun sonunda işlem adını verin

sudo killall {processName}

2

nohup'ta bir iş oluşturduğunuzda size işlem kimliğini söyleyecektir!

nohup sh test.sh &

çıktı size işlem kimliğini gösterecektir.

25013

o zaman öldürebilirsin:

kill 25013

1

Django sunucusunu aşağıdaki komutla başlattım.

nohup manage.py runserver <localhost:port>

Bu CentOS'ta çalışır:

:~ ns$netstat -ntlp
:~ ns$kill -9 PID 

Bu process not foundkarışıklığı nohup ile çözmek için gidilecek yol.
CodeSpent

0

Bugün aynı problemle karşılaştım. Ve uzun zaman önce olduğundan, hangi komutu ne zaman kullandığımı tamamen unuttum. Üç yöntem denedim:

  1. Komutta gösterilen STIME kullanarak ps -ef. Bu, işleminize başladığınız zamanı gösterir ve ssh'ı kapatmadan hemen önce komut vermenizden vazgeçmeniz çok olasıdır (size bağlıdır). Ne yazık ki en son komut nohup kullanarak çalıştırdığım komut olduğunu sanmıyorum, bu yüzden bu benim için çalışmıyor.
  2. İkincisi, ps -efkomutta da gösterilen PPID'dir . İşlemi oluşturan sürecin kimliği olan Ana Süreç Kimliği anlamına gelir. Çalıştırmak için nohup kullanan işlem için ubuntu'da ppid 1'dir. Sonra kullanabilirsinizps --ppid "1" listeyi almak için ve sürecin PID'sini bulmak için TIME (işleminizin kullandığı toplam CPU süresi) veya CMD'yi kontrol edebilirsiniz.
  3. lsof -i:portİşlem bazı bağlantı noktalarını kaplarsa kullanın ve komutu alırsınız. Sonra yukarıdaki cevap gibi, kullanın ps -ef | grep commandve PID alacaksınız.

İşlemin PID'sini bulduktan sonra kill pid, işlemi terminallemek için kullanabilirsiniz .

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.