İşlem nasıl kontrol ediliyor zaten çalışıyor veya çalışmıyor


32

Belirli bir işlemi zaten çalışmakta olup olmadığını kontrol etmek istiyorum.

Bu soru-cevap bilgisini aldım .

Ancak belirli bir çözüm bulamadım. Çalıştığım örnek aşağıdadır: abc.shDosya oluşturdum ve bu betiği arka planda olduğu gibi çalıştırdım sh abc.sh &.

Şimdi bu dosya arka planda çalışıyor ve ben ps aux | grep "abc"komutu açıyorum .

Bu komutun çıktısı aşağıdadır:

prakash     3594  0.0  0.0   4388   820 pts/0    S+   16:44   0:00 grep --color=auto abc

Bundan sonra abc.shçalışan betiği durdururum ve aynı komut ps aux | grep "abc"komutunu ateşledim .

Ancak şöyle bir çıktı alıyorum:

prakash     3594  0.0  0.0   4388   820 pts/0    S+   16:44   0:00 grep --color=auto abc

Sürecin çalışmakta olup olmadığını bulmak için başka bir yolu var mı?

Yanıtlar:


41

Her süreç çıktısında listelenir ps aux; koşma, uyuma, zombi veya durdu.

Eğer kullanarak işlemi ran Ancak, senin durumunda, sh abc.sh, shkoşu ve olmayan uygulama (kabuk) 'dir abc.sh. Bu nedenle, ps auxişlem içermez abc.shçünkü bunların grepherhangi bir sonuç değil.

Yani, kullanmanız gereken doğru yol şöyle:

ps aux | grep sh

Bu ayrıca dizgede shçıktılarının herhangi bir yerinde çalışan diğer işlemleri de geri getirebilir ps aux.

Çıktısı olarak ps auxolduğu STATgibi işlem "çalışıyor" olacağını unutmayın R. Bundan başka bir şeyse, çalışan işlemleri kontrol etmek için komutu attığınız durumda çalışmıyor. Farklı işlem durumları ps için man sayfasında bulunabilir:

D    uninterruptible sleep (usually IO)
R    running or runnable (on run queue)
S    interruptible sleep (waiting for an event to complete)
T    stopped, either by a job control signal or because it is being traced
W    paging (not valid since the 2.6.xx kernel)
X    dead (should never be seen)
Z    defunct ("zombie") process, terminated but not reaped by its parent

topİşlemin çalışıp çalışmadığını veya uykuda olup olmadığını ve harcadığı CPU, RAM miktarını kontrol etmek için komutu çalıştırabilirsiniz. (Bu işleminizi tekrar olarak listeleyecektir sh).

Ancak, işleminizin şu şekilde listelenmesini abc.shistiyorsanız, o zaman çalıştırdığınız komut dosyasının ilk satırına sahip olmalısınız:

#!/bin/sh

böylece kabuk, betiği çalıştırmak için hangi uygulamanın kullanılacağını bilecektir (bu durumda, #!/bin/bashbash olarak değiştirin ) ve sonra aşağıdakileri kullanarak işlem için çalıştırılabilir izinler sağlayın:

chmod +x /path/to/abc.sh

Dosyanın /path/to/konumu ile değiştirme abc.shve daha sonra abc.shkullanarak çalıştırmak

/path/to/abc.sh

tekrar dosyanın /path/to/konumu ile değiştiriliyor abc.sh.


2
Hızlı bir soru. stat ne S+demek
Prakash V Holkar

Ancak çalışan işlemler arasındaki farkı ps aux | grep filenamekomutun çıktısı ile çalışan işlemler arasında bulabilirsiniz .
Avinash Raj

@TechGuru: İşlemin ön planda olduğu anlamına gelir, daha fazlası için ps'nin manuel sayfasına bakın.
jobin

@AvinashRaj: Evet, elbette yapabilirsiniz.
jobin

Bir hata alıyorum: Hata, bunu yapın: mount -t proc proc / proc
IgorGanapolsky 0

7

Benim sorunum grepbunun tamamen ayrıştırıcı olması. Örneğinizde, "abc" kelimesini arıyorsunuz, ancak grep("abc" ifadesini arayan) örneğini geri çekiyor . Biraz dairesel. Filtreleyebilirsin ama hepsini biraz sapık buluyorum.

awkBiraz panache almaya giderdim .

ps aux | awk '$12=="abc.sh"'

awksatırları boşluklara göre alanlara böler (varsayılan olarak). $ 11 + alanları komut sütunlarıdır, bu yüzden eğer komut "sh abc.sh ..." ise, $11olacaktır shve $12olacaktır abc.sh.

Bash'in &&ve ||operatörlerin çıktısını veya zincirini kontrol etmek istiyorsan, biraz daha zeki olman gerekir. eğer bir şey bulunmazsa grepdurum kodu 1 (teknik arıza, tetikleyiciler ||) ile awkçıkacak , fakat her zaman 0 kodundan çıkacak.

ps aux | awk '$12=="abc.sh" {exit 0} END{exit 1}' && echo running || echo not running

Tabii ki sadece ekrana çıktı yazmayı önemsiyorsanız, hepsini de yapabilirsiniz awk:

ps aux | awk '$12=="abc.sh" {print "running"; exit} END{print "not running"}'

4

Mevcut bash oturumunda arka planda başlatılan bir işlem olup olmadığını kontrol etmek için doğru yöntem sh abc.sh &zaten çalışıyor mu yoksa jobsyerleşik komut kullanmak mı .

Örnek:

$ sh abc.sh &
[1] 6917
$ jobs
[1]+  Running                 sh abc.sh &

Bu sh abc.sh, arka planda başlatılan işlemin çalıştığı anlamına gelir . İşlem bittiyse şöyle bir şey göreceksiniz:

[1]+  Done                    sh abc.sh

Arka planda çalışan daha fazla işleminiz varsa, çıktıyı yalnızca aşağıdaki sh abc.shişlemleri kullanarak kısıtlayabilirsiniz :

jobs sh

Daha help jobsfazla bilgi için bakınız .

Yukarıdaki yöntem sadece şu anki bash oturumunda çalışacaktır. Ancak, başka bir bash oturumundaysanız (örneğin, başka bir terminal penceresinde veya sekmesinde veya bir komut dosyasında)

ps aux | grep "[s]h bin/test.sh"

ayrıca kullanabilirsiniz:

pgrep -a sh

Bu bana daha basit görünüyor. Yazılan komutunuzu çıktıda görürseniz ( sh abc.shbu durumda), bu işlem hala çalışıyor demektir. Aksi takdirde işlem tamamlanmıştır.


3

Komut dosyanız şu anda çalışıyorsa, ps auxkomutla gösterilmesi gerekir . Gösterilmezse ps, komut dosyası yürütme işleminiz şu anda sonlandırılmış olabilir.

Bunun çıktısı, pskomut dosyanızın şu anda çalışmadığı anlamına gelir.

$ ps aux | grep hm.sh
avinash   6386  0.0  0.0  15940   932 pts/16   S+   17:34   0:00 grep --color=auto hm.sh

Bu şekilde gösterilirse, komut dosyanız şu anda çalışıyor demektir.

$ ps aux | grep hm.sh
avinash   6454  0.0  0.0  16616  1384 pts/16   S+   17:35   0:00 /bin/bash ./hm.sh
avinash   6535  0.0  0.0  15940   932 pts/27   R+   17:35   0:00 grep --color=auto hm.sh

Hepsi betiğin içeriğine dayanıyor.

Örneğin, böyle bir komut dosyası oluşturursanız. Yürütme sırasında HI mesajını görüntüler. Çıktının görüntülenmesi birkaç saniye sürer ve nihai sonucu ürettikten sonra sonlandırılır.

#!/bin/bash
echo "HI"

Ama senaryonun böyle olursa,

#!/bin/bash
sudo apt-get update

Sürecin sonlandırılması birkaç dakika sürer. Bu arada eğer ps aux | grep filenamekomut çalıştırırsanız , çıktıda gösterilecektir. Çünkü script şu anda çalışıyor.


-2
  • Tüm işlemleri kontrol etmek istiyorsanız 'top' kullanın.

  • Java tarafından yürütülen işlemleri bilmek istiyorsanız, ps -ef | grep java

  • diğer süreç ise sadece kullanın ps -ef | grep xyzya da basitçe/etc/init.d xyz status

  • gibi herhangi bir kod üzerinden eğer .sho zaman./xyz.sh status


1
-1 Bu komutlar bazı koşullar altında faydalı olsalar bile, bu koşulları bilmeyen bir kişi için hala yararsız olacaklardır. Her durumda onları yeterince açıklamıyorsunuz veya açıklamanız yanlış.
David Foerster

-2

Eğer herhangi bir işlemin altında olup olmadığını kontrol etmek istiyorsanız, o dizine gidin ve dosyanın sonunda ll -trgörürseniz .csvya da .workvb. yazdığınızda işlemin altında işlem yapılmadığı anlamına gelir.


Bu cevap hiç mantıklı değil. Bir dizinin içeriğini listelemek, bir işlemin çalışıp çalışmadığını size söylemez. Dosya uzantısı .csv, çalışan bir işlemle ilgili olmayan virgülle ayrılmış dosyalar içindir.
user369450
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.