ID proses menggunakan ps aux

9

Saya seorang pemula untuk pemrograman shell. Dengan asumsi bahwa saya telah memulai program (misalnya NetBeans) dari terminal saya, jika saya mengetik

ps aux|grep netbeans

Saya mendapatkan hasilnya

pre      18775  1.2  0.0  12524  1972 pts/3    S    20:17   0:00 

di mana 18775 menentukan PID dll dari proses.

Lalu aku membunuhnya menggunakan

kill 18775.

di mana NetBeans UI menghilang. Jika saya mencoba mendapatkan pid dengan menggunakan perintah pertama, saya masih mendapatkan:

pre      19137  0.0  0.0   9136  1068 pts/3    S+   20:19   0:00 grep --color=auto netbeans

Jika proses telah mati, mengapa masih menunjukkan output di atas?

P. Ramesh
sumber
1
Itu tidak menunjukkan Anda proses netbeans - itu menunjukkan proses grep melalui mana ps aux sedang disalurkan! Karena proses itu grep netbeans, itulah program yang Anda lihat di akhir baris ( grep --color=auto netbeans)
David Puglielli

Jawaban:

15

grep adalah grepping itu sendiri. Coba sesuatu seperti:

ps aux |grep [n]etbeans

ini membuat grep tidak menampilkan dirinya dalam output

roadmr
sumber
2
Ini berfungsi, tetapi tidak terlalu bagus. Anda juga bisa melakukannya ps aux | grep netbeans | grep -v grep. Tapi gunakan pgrep sebagai gantinya.
Martin Ueding
1
@queueoverflow pgrepakan menyenangkan, tetapi hanya cocok dengan nama proses. Pola pertama dapat cocok dengan kolom mana saja dari ps. (Misalnya, sesuatu berjalan di bawah python atau java, pgrep tidak akan menangkap hal yang benar. Sama dengan pkilldan seterusnya ..)
Izkata
5

Jangan pernah gunakan psbersama dengan grep.

Sebaliknya, gunakan killall netbeans, pkill netbeansuntuk membunuhnya. Untuk ID proses pgrep netbeans.

Lebih lanjut tentang ps dan grep .

Martin Ueding
sumber
5
Itu saran paling berguna yang pernah saya dengar. Selama orang tahu bagaimana proses grep akan terlihat dalam output dari ps (dimulai dengan "grep") maka sama sekali tidak ada bahaya dalam menggunakan keduanya bersama-sama. Saya mengerti saran tentang tidak menggunakan kill dalam skrip, tapi itu intinya.
ovangle
3
Dan saya pikir pgrep lebih buruk, karena hanya meminta Anda untuk 'membunuh $ (pgrep vi *)' atau sesuatu yang sangat tidak aman seperti itu.
ovangle
1
Ini juga merupakan jawaban yang paling tidak berguna di halaman ini, seperti pgrep,, pkilldan seterusnya hanya nama proses kecocokan - apa pun yang ditafsirkan (java, python, bash, dll ...) hanya dapat dibedakan dari yang lain dengan nama proses yang sama dengan menggunakan ps.
Izkata
3
@Izkata - menggunakan -f untuk pgrep dan pkill akan cocok dengan seluruh baris perintah. Terkadang berguna ketika mencoba mencocokkan hal-hal yang berjalan di bawah juru bahasa seperti yang Anda sebutkan. Ini juga merupakan cara yang bagus untuk menembak diri sendiri di kaki karena akan dengan senang hati membunuh apa pun yang merujuk pada pola Anda di mana saja di baris perintahnya :)
roadmr
4

Karena itu PID untuk proses grep yang sedang antri untuk dijalankan setelahnya ps aux.

berbentuk bulat panjang
sumber
@ Ovangle- blink aku tidak pernah memikirkannya! : D terima kasih!
P Ramesh
1
Sebenarnya, grepini sudah berjalan saat ps auxberjalan. Saat ps auxdijalankan, outputnya dikirim ke grepinstance yang berjalan sebagai input. Jika shell belum dieksekusi grep, itu tidak akan muncul di output ps.
Eliah Kagan