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:
- Panggilan berfungsi dengan baik untuk sementara waktu (2 jam atau lebih) kemudian mulai menggantung.
- Hanya pematian daya fisik yang menyelesaikan masalah. Saya tidak bisa reboot melalui terminal (hang juga)
Pertanyaan saya:
- Mengapa Linux menetapkan PID induk ke 1?
- Mengapa prosesnya tidak bisa terbunuh? (Saya juga mencoba
sudo kill -9 7238
)
killall
itu rupanya membunuh orang tua, bukan proses yang dia inginkan.<defunct>
nyaps
? Apa hubungannya dengan pertanyaan ini?$!
diakill -9
tanpa menunggu proses latar belakang dengan kamera ... setelahsleep 16
diakill -9
yang tua , tiba-tiba lagi. Baunya seperti .zombie ... Mengikuti aromanya (:-)) Anda dapat melihat bahwa, dengan mengikuti yangps -ef
ia lakukan, anak itu masih hidup, tetapi orang tuanya terbunuh (-9).kill -9
prosesnya sendiri. Masuk akal untuk berasumsi itu terbunuh dan tidak berfungsi ... ... bahkan lebih setelah panggilan tidak efektifsudo killall raspivid
. Bahkan mungkinraspivid
memunculkan 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 menghindarikill -9
proses dalam skrip utama.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.
sumber
Program ini mungkin membuka perangkat kamera, dan dengan membunuhnya secara paksa, Anda belum mengizinkannya untuk membersihkan dengan benar, jadi sekarang macet.
Beberapa pengamatan:
-t 15000
ke 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.sumber