killall bana `` işlem bulunamadı '' veriyor ama ps


17

Biri bana arasındaki farkı açıklayabilir misiniz killve killall? Neden killallneyi psgösterir?

# ps aux |grep db2
root      1123  0.0  0.8 841300 33956 pts/1    Sl   11:48   0:00 db2wdog                                         
db2inst1  1125  0.0  3.5 2879496 143616 pts/1  Sl   11:48   0:02 db2sysc                                        
root      1126  0.0  0.6 579156 27840 pts/1    S    11:48   0:00 db2ckpwd                                        
root      1127  0.0  0.6 579156 27828 pts/1    S    11:48   0:00 db2ckpwd                                        
root      1128  0.0  0.6 579156 27828 pts/1    S    11:48   0:00 db2ckpwd 

# killall db2ckpwd
db2ckpwd: no process found

# kill -9 1126
# kill -9 1127
# kill -9 1128

Sistem SuSe 11.3 (64 bit); çekirdek 2.6.34-12; procps sürüm 3.2.8; PSmisc 22.7'den killall; GNU coreutils 7.1'den öldür


SIGKILL (-9) ile süreçleri asla öldürmeyin.
vonbrand

Bir işlemin sonlandırılması gerektiğinde ne yapmalı?
Radek

Bu çok, çok son çare.
vonbrand

Yanıtlar:


19

Bu Linux'ta mı?

Tarafından kullanılan komut adının aslında birkaç kurnazca farklı sürümü vardır ps, killallvs.

İki ana varyant şunlardır: 1) çalıştırdığınızda alacağınız uzun komut adı ps u; ve 2) psbayraksız çalıştırdığınızda elde ettiğiniz kısa komut adı .

Muhtemelen en büyük fark, programınız bir kabuk komut dosyası veya Python, Java vb.

İşte farkı gösteren gerçekten önemsiz bir senaryo. Aradım mycat:

#!/bin/sh
cat

Çalıştırdıktan sonra, iki farklı tür var ps.

İlk olarak, olmadan u:

$ ps -p 5290
  PID TTY      ... CMD
 5290 pts/6    ... mycat

İkinci olarak u:

$ ps u 5290
USER       PID ... COMMAND
mikel     5290 ... /bin/sh /home/mikel/bin/mycat

İkinci sürümün nasıl başlayacağına dikkat edin /bin/sh?

Şimdi, anlayabildiğim kadarıyla, killallaslında /proc/<pid>/statparenler arasındaki ikinci kelimeyi komut adı olarak okur ve alır, bu yüzden çalıştırdığınızda belirtmeniz gereken şey budur killall. Mantıksal olarak, bu bayrak psolmadan söyledikleriyle aynı olmalıdır u, ancak kontrol etmek iyi bir fikir olacaktır.

Kontrol edilecek şeyler:

  1. cat /proc/<pid>/statkomut adı ne diyor?
  2. ps -e | grep db2komut adı ne diyor?
  3. yapmak ps -e | grep db2ve ps au | grep db2aynı komut adını gösterir?

notlar

Başka ps bayraklarını da kullanıyorsanız ps -o comm, kısa adı ve ps -o cmduzun adı görmek daha kolay olabilir .

Daha pkilliyi bir alternatif de bulabilirsiniz . Özellikle, pkill -ftam komut adını, yani ps uveya tarafından basılan komut adını kullanarak eşleşmeye çalışır ps -o cmd.


çok iyi bir açıklama. Ve sanırım ilk seferinde haklıydın. ps -e |grep db2 gives me 3084? 00:00:00 db2syscr` ve ps aux | grep db2 bana veriyor root 3084 0.0 0.6 579292 28304 ? S 13:02 0:00 db2ckpwd. Bu konuda yorum yapabilir. Biraz kayboldum.
Radek

Emin değilim. Programın adını değiştirmesi mümkündür. Nasıl çalıştırıldığını biliyor musunuz? Ne ls -l /proc/3084/exediyor? Peki whichya whenceya typedosyayı bulmak için ve sonra lsve typeo bir sembolik veya bir komut dosyası veya bir ikili olup olmadığını görmek için?
Mikel

ls -l / proc / 3084 / exe bize verirlrwxrwxrwx 1 root root 0 Jun 6 16:49 /proc/3084/exe -> /var/lib/db2/db2inst1/sqllib/adm/db2syscr
Radek

ls -l / var / lib / db2 / db2inst1 / sqllib / adm / db2syscr bana verir-r-sr-s--- 1 root db2iadm1 147K Feb 1 23:32 /var/lib/db2/db2inst1/sqllib/adm/db2syscr*
Radek

type bana verir / var / lib / db2 / db2inst1 / sqllib / adm / db2syscr/var/lib/db2/db2inst1/sqllib/adm/db2syscr is /var/lib/db2/db2inst1/sqllib/adm/db2syscr
Radek

6

killall bir işlem adıyla eşleşmeye çalışır (ancak eşleşen bölümde gerçekten iyi değildir).

Ve "ps | grep" ve "ps | grep | kill" çok daha iyi bir iş çıkardığı için, birisi bunu basitleştirdi ve pgrep ve pkill yarattı. "Ps grep" ve "ps kill" gibi komutları okuyun, çünkü bu komut önce ps sonra grep ve istenirse öldürür.


2

Benzer bir sorun vardı ama /proc/<pid>/statbeklenen dize içeriyordu. Strace kullanarak killall'a da erişildiğini görebiliyordum /proc/<pid>/cmdline.

Benim durumumda bulunan tüm argümanlar da dahil olmak üzere tam komuta benim komut kontrol başarısız olduğunu bulmak için gdb kullanarak araştırmaya devam etti /proc/<pid>/cmdline. Dosya adının 15 karakterden uzun olması nedeniyle tetiklenen kodun yolu gibi görünüyordu (bu, killall kaynağındaki sabit kodlanmış bir değerdir). Bir şekilde killall ile çalışmaya başlayıp başaramayacağımı tam olarak araştırmadım.

Ancak buradaki diğer yorumlarda belirtildiği gibi, pkill aynı sorunlara sahip olmayan daha iyi bir alternatiftir.

Kaynak kodu pkillburada ilgilenen için https://github.com/acg/psmisc bulunabilir .


0

Ubuntu 16 sistemlerinde / proc / pid / stat iş parçacığının adını içerecektir (bir program pthread_setname_np sistem çağrısı yoluyla yapabilir) .

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.