Apa itu proses yang terhenti di linux?

12

Jadi saya membuat beberapa skrip PHP berjalan dari baris perintah, dan ingin menghentikannya.

Saya berlari

$ ps aux | grep php
$ sudo kill 8754
$ sudo kill 8767

Dan kemudian berlari

$ ps aux | grep php

lagi untuk memeriksa proses telah dihentikan tetapi mendapat hasil seperti ini:

jon      8754  0.4 53.5 3044256 2205204 ?     T    10:34   0:15 php awesome_script.php
jon      8767  0.4 53.5 3044256 2205204 ?     T    10:34   0:15 php awesome_script.php
jon     12275  0.0  0.0   4156   892 pts/1    S+   11:27   0:00 grep --color=auto php

Aku mencari tahu apa yang dimaksud T di kolom negara bagian dan menemukan bahwa itu berarti Berhenti, tetapi saya tidak mengerti apa artinya proses itu dilakukan.

Saya tahu Anda dapat membuat penanganan sinyal Anda sendiri di PHP, tetapi saya belum melakukannya, jadi ketika PHP menerima sinyal SIGTERM apa fungsinya?

Apa yang dilakukan proses yang terhenti (jika ada)?

Jon
sumber

Jawaban:

15

Ini berarti proses telah menerima STOPsinyal, dan tidak akan melakukan banyak hal sampai menerima CONTsinyal, bahkan tidak berakhir.

Sumber STOPsinyal yang paling umum adalah pengguna memukul ^zketika proses berada di latar depan, dan cara umum untuk mengirim CONTsetelahnya adalah mengetik fgatau bgyang melanjutkan proses di latar depan dan latar belakang masing-masing.

Cara lain untuk mengirim STOPke suatu proses adalah kill -STOP $pid. Demikian pula, CONTdapat dikirim ke suatu proses dengan kill -CONT $pid.

Karena Anda mengirim TERMsinyal ke proses, saya berasumsi Anda ingin mereka berhenti. Agar itu terjadi, proses harus menerima CONTsinyal. Anda dapat mengirimnya dengan mengetikkan kill -CONT 8754 8767jendela terminal.

Eroen
sumber
Apakah mengirim sinyal CONT memungkinkan skrip dijalankan sampai selesai? Atau apakah itu akan menyebabkan skrip segera dihentikan?
Jon
Proses ini melanjutkan apa yang ia lakukan (sebelum BERHENTI) setelah menerima CONT. Namun, jika Anda mengirim JANGKA ( kill $pidmisalnya) saat dihentikan, maka (TERLambat) akan merespons JANGKA tersebut dan berakhir.
Eroen
Hmm, jadi saya mengirim TERM dengan menjalankan kill 8754yang seharusnya menyebabkan proses akhirnya berakhir kan? Apakah Anda tahu di negara bagian mana suatu proses akan berlangsung sementara itu sudah hampir berakhir? Mengingat bahwa proses memasuki status STOP, seolah-olah telah menerima sinyal STOP dari kill -STOP 8754, dapatkah itu juga terjadi jika ia mengirim sinyal TERM?
Jon
Proses yang berhenti tidak akan berhenti karena TERMsinyal sampai itu dilanjutkan. Ini akan segera berakhir jika menerima KILLsinyal, bahkan ketika berhenti. Saya berasumsi bahwa suatu proses akan berada dalam kondisi Jalankan ketika berakhir. Saya tidak terlalu terbiasa dengan PHP, dan tidak tahu bagaimana mengatakan mengapa suatu proses berhenti, maaf. Namun, secara umum, proses tidak berhenti tetapi berhenti ketika mereka menerima TERM.
Eroen
4

Proses terhenti di Linux / Unix adalah proses / tugas yang menerima sinyal penangguhan ( SIGSTOP/ SIGTSTP) yang memberitahu kernel untuk tidak melakukan pemrosesan apa pun di dalamnya seperti yang telah dihentikan, dan itu hanya dapat melanjutkan kembali pelaksanaannya jika mengirimkan SIGCONTsinyal.

Pada dasarnya proses berhenti menunggu sinyal lanjutan dari kernel, sama seperti proses yang ditangguhkan menunggu kondisi bangun dari kernel.

Status proses kernel Linux: Siap, Berjalan, Dihentikan, Ditangguhkan, Dilacak, Zombie

Kredit gambar: polytechnique.fr


Setiap proses dalam kernel Linux diwakili oleh task_structstruktur data dan setiap taskvektor terdiri dari array pointer ke setiap task_struct. yang menggambarkan suatu proses atau tugas dalam sistem (baik itu unrunnable, runnableatau stopped). Lihat: Proses dan Struktur Data Linux ) untuk lebih jelasnya.

Lihat juga: Kernel Linux: Manajemen Proses

kenorb
sumber
@Jus Terima kasih atas laporannya, saya sudah memperbaikinya.
kenorb