Mengapa saya tidak bisa mematikan proses ini di Linux?

8

Masalah

Saya ingin membunuh proses yang disebut raspivid (program yang merekam video menggunakan Kamera Raspberry Pi) tapi saya tidak bisa ...

Beginilah saya menyebutnya:

#!/bin/bash

#Start recording...
raspivid -w 800 -h 600 -t 15000 -o $1 -v -n -rot 270 >> /home/pi/log/camera_output.txt 2>&1 &

#Waiting the video to be complete
sleep 16

#Killing child process
sudo kill -9 $!

#Killing parent process
sudo kill -9 $$

Jika saya mencari proses ini, masih ada di sana:

pi@raspberrypi ~ $ ps -ef | grep raspivid
root      7238     7234  0 21:53 ?        00:00:00 [raspivid]
pi       17096 14925  0 22:05 pts/0    00:00:00 grep --color=auto raspivid

Jika saya mencoba membunuhnya, itu tidak mati. Alih-alih itu mengubah PID induk menjadi 1:

pi@raspberrypi ~ $ sudo killall raspivid
pi@raspberrypi ~ $ ps -ef | grep raspivid
root      7238     1  0 21:53 ?        00:00:00 [raspivid]
pi       17196 14925  0 22:05 pts/0    00:00:00 grep --color=auto raspivid
pi@raspberrypi ~ $ sudo killall raspivid

Pengamatan:

  1. Panggilan berfungsi dengan baik untuk sementara waktu (2 jam atau lebih) kemudian mulai menggantung.
  2. Hanya pematian daya fisik yang menyelesaikan masalah. Saya tidak bisa reboot melalui terminal (hang juga)

Pertanyaan saya:

  1. Mengapa Linux menetapkan PID induk ke 1?
  2. Mengapa prosesnya tidak bisa terbunuh? (Saya juga mencoba sudo kill -9 7238)

sumber

Jawaban:

2

Masalah

Skrip Anda mungkin membuat zombie karena kill -9perintah Anda ; seperti yang disarankan dari jawaban jjlin juga tidak pernah merupakan praktik yang baik untuk membunuh secara tiba-tiba beberapa proses tanpa dipaksa.

Dari man bashkita bisa membaca:

Proses yang ditandai <ditunda> adalah proses mati (disebut " zombi ") yang tetap karena orangtua mereka belum menghancurkannya dengan benar . Proses-proses ini akan dihancurkan oleh init (8) jika proses induk keluar.

Jawaban # 1: Proses init memiliki PID 1 dan untuk Linux ini menugaskan mereka induknya dengan PID 1 (karena ia menetapkan mereka untuk init ).

Jawaban # 2: Mereka tidak dapat dibunuh hanya karena mereka baru saja mati ... jika orang tua mereka initmungkin cukup untuk menunggu beberapa saat.

Untuk menghapus zombie dari suatu sistem, sinyal SIGCHLD dapat dikirim ke induk secara manual, menggunakan perintah kill. Jika proses induk masih menolak untuk menuai zombie, langkah selanjutnya adalah menghapus proses induk. Ketika suatu proses kehilangan induknya, init menjadi induk baru. Init secara berkala mengeksekusi panggilan sistem tunggu untuk menuai zombie apa pun dengan init sebagai induk. [1]

Kalau-kalau ide ini muncul satu hari atau yang lain: untuk #kill -9 initmemproses dengan hak root adalah perangkat lunak yang setara dengan mencabut komputer dari jaringan listrik. [:-)]

Namun proses zombie dapat diidentifikasi dalam output psperintah dengan kehadiran "Z" di kolom STAT . Anda dapat menggunakan baris berikut untuk mengidentifikasi mereka dengan mudah

ps -aux | grep Z

Beberapa referensi tentang dunia zombie Linux :

Cepat
sumber
Proses dengan induk PID 1 bukan zombie. Suatu proses membuat orang tua ini ketika orang tuanya dibunuh sebelum itu. Jadi killallitu rupanya membunuh orang tua, bukan proses yang dia inginkan.
Barmar
Di mana Anda melihat output- <defunct>nya ps? Apa hubungannya dengan pertanyaan ini?
Barmar
@Barmar saya tidak melihat. Sayangnya tidak selalu masalahnya persis di mana Anda mencari . BTW dari $!dia kill -9tanpa menunggu proses latar belakang dengan kamera ... setelah sleep 16dia kill -9yang tua , tiba-tiba lagi. Baunya seperti .zombie ... Mengikuti aromanya (:-)) Anda dapat melihat bahwa, dengan mengikuti yang ps -efia lakukan, anak itu masih hidup, tetapi orang tuanya terbunuh (-9).
Hastur
1
Saya pikir Anda membingungkan proses anak yatim dengan proses zombie, tetapi mereka tidak berhubungan.
Barmar
Melihat lagi naskahnya: dia kill -9prosesnya sendiri. Masuk akal untuk berasumsi itu terbunuh dan tidak berfungsi ... ... bahkan lebih setelah panggilan tidak efektif sudo killall raspivid. Bahkan mungkin raspividmemunculkan proses anak sendiri yang tetap yatim piatu. BTW itu cukup untuk melakukan "ps -aux | grep Z" untuk melihat apakah itu zombie atau tidak, dan itu harus (cukup) untuk menghindari kill -9proses dalam skrip utama.
Hastur
4

Untuk menjawab pertanyaan nomor 1:

Ketika suatu proses melahirkan proses anak, masing-masing anak memiliki PID mereka sendiri. PPID setiap anak (id proses induk) adalah PID dari proses induknya. Jika orang tua meninggal, maka proses anak menjadi yatim. Proses yatim secara otomatis diambil oleh sistem init proses yang memiliki PID 1.

glapworth
sumber
0

Program ini mungkin membuka perangkat kamera, dan dengan membunuhnya secara paksa, Anda belum mengizinkannya untuk membersihkan dengan benar, jadi sekarang macet.

Beberapa pengamatan:

  • Biasanya bukan ide yang baik untuk mematikan program dengan memulai dengan -9 kecuali Anda tahu apa yang Anda lakukan. Hanya membunuh normal (tanpa opsi) baik-baik saja.
  • Seharusnya tidak ada keharusan untuk melakukan pembunuhan dalam naskah Anda sama sekali. Anda telah beralih -t 15000ke program untuk menentukan panjang video, jadi pembunuhan pertama tidak perlu dilakukan. Pembunuhan kedua juga tidak perlu karena shell akan keluar sendiri ketika mencapai akhir skrip. Jika program tidak keluar sendiri (sebagaimana mestinya), maka Anda memiliki masalah lain.
jjlin
sumber