Cara mengecek prosesnya sudah berjalan atau belum

32

Saya ingin memeriksa proses tertentu sudah berjalan atau tidak.

Saya mewasiti Q&A ini .

Tetapi saya tidak mendapatkan solusi spesifik. Berikut ini adalah contoh yang saya coba: Saya telah membuat abc.shfile dan menjalankan skrip ini di latar belakang, seperti sh abc.sh &.

Sekarang file ini berjalan di latar belakang dan saya jalankan ps aux | grep "abc"perintah.

Berikut ini adalah output dari perintah ini:

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

Setelah itu saya menghentikan abc.shskrip yang berjalan dan menjalankan perintah ps aux | grep "abc"perintah yang sama .

Tapi saya mendapatkan output yang sama seperti:

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

Apakah ada cara lain untuk menemukan proses berjalan atau tidak?

Prakash V Holkar
sumber

Jawaban:

41

Setiap proses akan dicantumkan dalam output dari ps aux; apakah berlari, tidur, zombie atau berhenti.

Namun, dalam kasus Anda, sejak Anda menjalankan proses menggunakan sh abc.sh, shadalah aplikasi (shell) yang sedang berjalan dan tidak abc.sh. Karenanya, ps auxtidak akan mengandung proses abc.shkarena yang greptidak dapat menghasilkan hasil apa pun.

Jadi, cara yang benar Anda seharusnya menggunakannya adalah sebagai:

ps aux | grep sh

Ini juga dapat mengembalikan Anda proses lain yang menjalankan memiliki string shdi mana saja di output ps aux.

Anda harus mencatat bahwa proses akan "berjalan" ketika output ps auxmemiliki STATas R. Jika itu adalah sesuatu selain itu, itu tidak berjalan pada saat Anda memecat perintah untuk memeriksa proses yang berjalan. Status proses yang berbeda dapat ditemukan di halaman manual untuk ps:

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

Anda juga bisa menjalankan topperintah untuk memeriksa apakah proses sedang berjalan atau tidur dan jumlah CPU, RAM yang dikonsumsi. (Ini lagi akan mencantumkan proses Anda sebagai sh).

Namun, jika Anda ingin proses Anda terdaftar abc.sh, maka Anda harus memiliki baris pertama skrip yang Anda jalankan sebagai:

#!/bin/sh

sehingga shell akan tahu aplikasi apa yang digunakan untuk menjalankan skrip (sh dalam hal ini, ubah ke #!/bin/bashuntuk bash) dan kemudian berikan izin yang dapat dieksekusi untuk proses menggunakan:

chmod +x /path/to/abc.sh

mengganti /path/to/dengan lokasi abc.shfile dan kemudian jalankan abc.shmenggunakan

/path/to/abc.sh

kembali mengganti /path/to/dengan lokasi abc.shfile.

pekerjaan
sumber
2
Satu pertanyaan singkat. apa S+arti stat
Prakash V Holkar
Tetapi Anda dapat menemukan perbedaan antara menjalankan proses dan tidak menjalankan proses melalui output dari ps aux | grep filenameperintah.
Avinash Raj
@ TechGuru: Ini berarti bahwa proses sedang tidur di latar depan, lihat halaman manual ps untuk lebih lanjut.
Pekerjaan di
@AvinashRaj: Ya, tentu saja Anda bisa.
jobin
Saya mendapatkan kesalahan: Kesalahan, lakukan ini: mount -t proc proc / proc
IgorGanapolsky
7

Masalah saya grepadalah bahwa ini adalah pengurai seluruh baris. Dalam contoh Anda, Anda mencari "abc" tetapi menarik kembali contoh grep(yang mencari "abc"). Sedikit melingkar. Anda dapat memfilternya tetapi saya menemukan semua itu sedikit menyimpang.

Saya akan berpaling awkuntuk sedikit panik.

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

awkmembagi garis menjadi bidang berdasarkan spasi putih (secara default). Bidang $ 11 + adalah kolom perintah jadi jika perintahnya adalah "sh abc.sh ...", $11akan shdan $12akan abc.sh.

Jika Anda ingin mengontrol output atau rantai dengan Bash's &&dan ||operator, Anda bisa tetapi Anda harus sedikit lebih pintar. grepakan keluar dengan kode status 1 (gagal teknis, pemicu ||) jika tidak ada yang ditemukan tetapi awkakan selalu keluar dari kode 0. Kita dapat mengubahnya dengan menyuruhnya keluar jika menemukan sesuatu dan melemparkan 1 jika tidak:

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

Tentu saja jika Anda hanya ingin menulis output ke layar, Anda bisa melakukan itu semua di awk:

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

Cara yang tepat untuk memeriksa di sesi bash saat ini jika proses dimulai di latar belakang, seperti sh abc.sh &, sudah berjalan atau tidak adalah dengan menggunakan jobsperintah builtin.

Contoh:

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

Itu berarti bahwa sh abc.shproses yang dimulai di latar belakang sedang berjalan. Jika proses telah selesai, Anda akan melihat sesuatu seperti:

[1]+  Done                    sh abc.sh

Jika Anda memiliki lebih banyak proses yang berjalan di latar belakang, Anda dapat membatasi output hanya untuk sh abc.shproses menggunakan:

jobs sh

Lihat help jobsuntuk info lebih lanjut.

Metode di atas hanya akan berfungsi di sesi bash saat ini. Tetapi jika Anda berada di sesi bash lain (misalnya di jendela atau tab terminal lain, atau dalam skrip), selain dari:

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

Anda juga dapat menggunakan:

pgrep -a sh

yang tampaknya lebih sederhana bagiku. Jika Anda akan melihat perintah yang diketik dalam output ( sh abc.shdalam hal ini), itu berarti bahwa prosesnya masih berjalan. Jika tidak, proses telah selesai.

Radu Rădeanu
sumber
3

Jika skrip Anda sedang berjalan, itu harus ditunjukkan dengan ps auxperintah. Jika tidak ditampilkan oleh ps, maka mungkin eksekusi skrip Anda saat ini dihentikan.

Output psseperti ini berarti skrip Anda saat ini tidak berjalan,

$ 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

Jika ditampilkan seperti ini, artinya skrip Anda sedang berjalan.

$ 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

Itu semua berdasarkan pada isi skrip.

Misalnya, jika Anda membuat skrip seperti ini. Ini menampilkan pesan HI pada eksekusi. Butuh beberapa detik untuk menampilkan output dan dihentikan setelah menghasilkan hasil akhir.

#!/bin/bash
echo "HI"

Tetapi jika skrip Anda seperti ini,

#!/bin/bash
sudo apt-get update

Butuh beberapa menit untuk menghentikan proses. Sementara itu jika Anda menjalankan ps aux | grep filenameperintah, itu akan ditampilkan pada output. Karena skrip sedang berjalan.

Avinash Raj
sumber
-2
  • jika Anda ingin memeriksa semua proses maka gunakan 'top'

  • jika Anda ingin mengetahui proses yang dijalankan oleh java maka gunakan ps -ef | grep java

  • jika proses lain maka gunakan saja ps -ef | grep xyzatau cukup/etc/init.d xyz status

  • jika melalui kode apa pun seperti .shitu./xyz.sh status

Umman
sumber
1
-1 Meskipun perintah ini berguna dalam beberapa keadaan, mereka tetap tidak berguna bagi seseorang yang tidak mengetahui keadaan ini. Dalam setiap kasus Anda tidak cukup menjelaskannya atau penjelasan Anda salah.
David Foerster
-2

jika Anda hanya ingin memeriksa apakah ada yang sedang dalam proses kemudian pergi ke direktori itu dan ketik ll -trjika Anda melihat .csvatau .worklain - lain di akhir file maka itu berarti dalam proses lain tidak.

Umman
sumber
Jawaban ini tidak masuk akal. Daftar isi direktori tidak akan memberi tahu Anda jika suatu proses sedang berjalan. Ekstensi file .csvadalah untuk file yang dibatasi koma yang tidak terkait dengan proses yang sedang berjalan.
pengguna369450