Pertama, ya saya telah melihat pertanyaan ini:
Temukan (dan bunuh) proses lama
Jawabannya ada yang salah dan tidak berfungsi. Saya telah memilih dan berkomentar sesuai.
Proses yang ingin saya bunuh terlihat seperti ini ketika terdaftar dengan ps aux | grep page.py
:
apache 424 0,0 0,1 6996 4564? S 07:02 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 2686 0,0 0,1 7000 3460? S Sep10 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 2926 0.0 0.0 6996 1404? S Sep02 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 7398 0.0 0.0 6996 1400? S Sep01 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 9423 0,0 0,1 6996 3824? S Sep10 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 11022 0,0 0,0 7004 1400? S Sep01 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 15343 0,0 0,1 7004 3788? S Sep09 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 15364 0,0 0,1 7004 3792? S Sep09 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 15397 0,0 0,1 6996 3788? S Sep09 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 16817 0.0 0.1 7000 3788? S Sep09 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 17590 0.0 0.0 7000 1432? S Sep07 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 24448 0.0 0.0 7000 1432? S Sep07 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 30361 0,0 0,1 6996 3776? S Sep09 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py
Saya ingin menyiapkan cron harian sederhana yang akan menemukan dan membunuh page.py
proses yang lebih lama dari satu jam.
Jawaban yang diterima pada pertanyaan yang disebutkan di atas tidak berfungsi, karena tidak cocok dengan rentang waktu, hanya cocok dengan proses yang telah berjalan dari 7 hari hingga 7 hari, 23 jam 59 menit dan 59 detik. Saya tidak ingin membunuh proses yang telah berjalan dari 1-2 jam, tetapi lebih dari 1 jam.
Jawaban lain untuk pertanyaan yang disebutkan di atas menggunakan find
tidak berfungsi, setidaknya tidak pada Gentoo atau CentOS 5.4, itu juga memuntahkan peringatan, atau tidak mengembalikan apa pun jika saran dari peringatan tersebut diikuti.
Berkat jawaban Christopher, saya dapat menyesuaikannya dengan yang berikut:
-mmin
adalah perintah find yang saya lewatkan.sumber
find /proc -maxdepth 1 -type d -name 1 -mmin +60 -ls
- / sbin / init tidak terdaftar meskipun hitungan uptime berhari-hari, bukan jam. Tampaknya Anda tidak dapat mengandalkan waktu modifikasi dir / proc /.temukan tidak selalu berfungsi, tidak setiap sistem memiliki etimes yang tersedia, dan itu mungkin status regex newb saya, tapi saya rasa Anda tidak perlu lebih dari ini:
Anda kemudian dapat pipa itu untuk membunuh atau apa pun kebutuhan Anda.
sumber
ps
, tetapi saya akan melipat beberapagrep
s menjadi satuawk
, dan untuk keamanan membatasi pencocokan pola ke kolom tertentu (untuk mengesampingkan misalnya pencocokan nama perintah builder, dll.)Jika mau, Anda dapat memberi makan
ps
dengan daftar PID untuk dicari di dalamnya, misalnya:sumber
etimes
hanya berfungsi untuk yang lebih barups
Saya pikir Anda dapat mengubah beberapa dari jawaban sebelumnya yang sesuai dengan kebutuhan Anda. Yaitu:
Atau
Saya pikir yang kedua paling sesuai dengan kebutuhan Anda. Versi find akan mengakhiri proses lain oleh pengguna tersebut
--Christopher Karel
sumber
kill -9
kecuali sebagai pilihan terakhir. Gunakan-SIGINT
atau-SIGTERM
.ps
akan menampilkan waktu dalam^..:..$
format ketika kurang dari satu jam.sumber
psmisc
utilitas ini? OP menyebutkan CentOS; apakah tersedia sebagai RPM?Masalah
Mengkonversi
etime
kolom (waktu yang berlalu)ps
perintah ke detik. Spesifikasi waktu dalam format ini[[dd-]hh:]mm:ss
. Versi yang lebih barups
memilikietimes
kolom yang menampilkanetime
nilai dalam hitungan detik.Solusinya: fungsi awk kustom sederhana
Fungsi awk khusus ini mendukung semua format
etime
kolom (misalnya03-12:30:59
,00:07
dll.) Cukup tempel di skrip awk Anda, ini adalah solusi ramah satu-liners.sec(T)
mengkonversi T ke detikT
spesifikasi waktu dalam[[dd-]hh:]mm:ss
format (misetime
)C
jumlah bidang dalamT
(setara dengan variabel NF awk)A
array bidang dalamT
(setara dengan $ variabel awk)A[C>3?C-3:99]
ini cara aman untuk merujuk nilai keempat (yaitu jumlah hari) dalam urutan terbalik. Pendekatan ini bermanfaat karena hari dan jam adalah opsional. Jika array tidak cukup panjang itu dereferenceA[99]
yang akan menghasilkan0
nilai. Saya berasumsi99
cukup tinggi untuk sebagian besar kasus penggunaan.Contoh dunia nyata
Bash oneliner ini akan mematikan
soffice.bin
proses yang berjalan di bawah pengguna saat ini jika prosesnya lebih dari 180 detik.sumber
The
lstart
lapangan dips
memberikan format waktu yang konsisten yang kita dapat memberi makan untukdate
untuk mengkonversi ke detik sejak zaman tersebut. Kemudian kita membandingkannya dengan waktu sekarang.sumber
Saya mengubah jawaban yang mereka berikan pada posting sebelumnya
Ekspresi reguler mencari 2 jenis argumen kedua:
Hours:minutes:seconds
ekspresi.Itu harus cocok dengan segala sesuatu kecuali proses muda yang akan memiliki formulir
minutes:seconds
.sumber
Ini mungkin berlebihan, tetapi saya cukup penasaran untuk menyelesaikannya dan mengujinya bekerja (pada nama proses yang berbeda pada sistem saya, tentu saja). Anda dapat membunuh penangkapan
$user
dan$pid
untuk menyederhanakan regexp, yang saya hanya tambahkan untuk debugging, dan tidak merasa ingin merobek kembali. Bernama menangkap dari perl 5.10 akan mencukur beberapa baris lagi, tetapi ini harus bekerja pada perl yang lebih tua.Anda harus mengganti cetakan dengan kill, tentu saja, tetapi saya tidak akan benar-benar membunuh apa pun di sistem saya sendiri.
sumber
Saya memiliki server dengan tanggal yang salah di / proc dan ternyata tidak berfungsi, jadi saya menulis skrip ini:
sumber
Versi python menggunakan ctime dari entri proses di
/proc
:sumber
Saya menggunakan skrip sederhana ini butuh dua argumen nama proses dan umur dalam hitungan detik.
sumber
ini seharusnya bekerja
killall --older-than 1h $proc_name
sumber
--older-than
dan mudah untuk mengabaikannya. Dibandingkan dengan jawaban lain, ini jauh lebih mudah, dan sekarang tersedia di EL7.Saya tidak puas dengan solusi yang lain, kebanyakan dari mereka terlalu samar (pengetahuan bash saya agak terbatas) dan jadi saya tidak dapat menyesuaikannya ...
Saya telah membuat solusi sendiri, Mungkin bukan yang terbaik tetapi berfungsi dan itu bisa dibaca
Anda dapat menyimpan skrip ini dalam file dan membuatnya dapat dieksekusi (akhirnya menyebutnya dengan menggunakan cron)
sumber
72 = 3 hari 48 = 2 hari 24 = 1 hari
berhasil :)
sumber