Matikan proses setelah dibiarkan berjalan selama beberapa waktu

13

Saya ingin membatasi waktu grepperintah proses diizinkan untuk menjalankan atau hidup.

Sebagai contoh. Saya ingin melakukan hal berikut:

grep -qsRw -m1 "parameter" /var

Tetapi sebelum menjalankan grepperintah, saya ingin membatasi berapa lama grepproses ini berjalan, katakan tidak lebih dari 30 detik.

Bagaimana saya melakukan ini?

Dan jika bisa, bagaimana cara mengembalikan atau mengatur ulang agar tidak memiliki batas waktu sesudahnya.

yael
sumber
3
bukankah kamu sudah menanyakan ini? stackoverflow.com/questions/3061377/…
Tidak ada pertanyaan lainnya karena saya tidak mendapatkan jawaban tentang pertanyaan awal Yael
4
@el: Anda mendapat solusi yang sangat baik sebelumnya, menggunakan timeout, dan Anda bahkan mendapat instruksi tentang cara menginstalnya. Tidak sopan mengabaikan jawaban ini dan kemudian menggandakan pertanyaan Anda.
Paul R
maaf tapi TIDAK, saya tidak mau menginstal apapun di sistem saya THX yael
5
@yael: maka Anda perlu memperbarui pertanyaan awal Anda untuk memasukkan batasan ini , BUKAN hanya menduplikasi pertanyaan dan mulai dari awal lagi
Paul R

Jawaban:

12

Anda dapat menggunakan timelimit , ini tersedia di ubuntu default atau Anda dapat mengompilasinya sendiri.

timelimit mengeksekusi perintah dan mengakhiri proses spawned setelah waktu tertentu dengan sinyal yang diberikan. Sinyal "peringatan" dikirim terlebih dahulu, kemudian, setelah batas waktu, sinyal "bunuh", mirip dengan cara init (8) beroperasi pada shutdown.

feniix
sumber
2
Itu tidak ada di Ubuntus saya (desktop 10,10, server 11,04) jadi mungkin bukan default. Namun mudah diraih dengan cepat sudo aptitude install timelimit. Bekerja sangat bagus setelah diinstal.
Hari
7

Berikut ini beberapa bash yang sedikit hackish untuk itu:

grep -qsRw -m1 "parameter" /var &

GREPPID=$!

( sleep 30; kill $GREPPID ) &

fg $GREPPID

Pada dasarnya, ini memulai pencarian di latar belakang, kemudian memulai subkulit yang menunggu 30 detik dan kemudian membunuh proses pencarian. Jika pencarian membutuhkan waktu <30 detik, prosesnya akan mati. Bukan ide yang bagus untuk membunuh proses yang sudah mati karena ada kemungkinan sangat kecil sesuatu yang lain akan menggunakan kembali pid, tetapi untuk sesuatu seperti ini umumnya tidak apa-apa. Terakhir, pencarian diletakkan kembali di latar depan dan akan berjalan sampai selesai atau terbunuh.

Walter Mundt
sumber
bagaimana cara mendapatkan $? dari grep dalam kasus ini karena dalam skrip saya mengambil $? dari grep dan verifikasi apakah grep cocok dengan string? yael
Saya tidak yakin ada cara mudah untuk melakukan itu. Selain itu, pendekatan ini tidak berfungsi dalam skrip di mana bash tidak memiliki kontrol kerja aktif. Anda mungkin harus menggunakan sedikit peretasan Perl untuk menyelesaikan pekerjaan dalam skrip. Hmm ...
Walter Mundt
adalah mungkin untuk sampai pertanyaan ini ke perl? Yael
4

Buat file baru yang disebut "tgrep" dan masukkan yang berikut ini (atau panggil apa saja yang Anda inginkan):

#!/bin/bash
grep $@ &
PID=$!
sleep 30 && kill $PID 2>/dev/null &
wait $PID
exit 0

Selanjutnya, jalankan chmod a+x tgrep. Sekarang jika Anda ingin menggunakannya Anda bisa mengetik

./tgrep -i "results" /home/dan/*txt

Atau Anda dapat menggunakannya sebagai tgrep (tanpa ./ dan dapat menggunakannya dari direktori mana pun) jika Anda meletakkannya di direktori yang terdapat dalam variabel $ PATH Anda (seperti / home / dan / bin /, jika itu ada di variabel $ PATH Anda, kalau tidak Anda bisa menambahkannya).

Jarvin
sumber