Giết quá trình sau khi nó được phép chạy một thời gian


12

Tôi muốn giới hạn thời gian một greplệnh quy trình được phép chạy hoặc còn sống.

Ví dụ. Tôi muốn thực hiện như sau:

grep -qsRw -m1 "parameter" /var

Nhưng trước khi chạy greplệnh tôi muốn giới hạn grepquá trình sống trong bao lâu , hãy nói không quá 30 giây.

Làm thế nào để tôi làm điều này?

Và nếu có thể, làm thế nào để tôi quay lại hoặc đặt lại để không bị giới hạn thời gian sau đó.


3
bạn đã không hỏi điều này chưa? stackoverflow.com/questions/3061377/ cường

Không có sự

4
@yael: bạn đã có một giải pháp hoàn toàn tốt trước đây, bằng cách sử dụng timeoutvà thậm chí bạn còn có hướng dẫn về cách cài đặt nó. Thật thô lỗ khi bỏ qua câu trả lời này và sau đó sao chép câu hỏi của bạn.
Paul R

xin lỗi nhưng KHÔNG tôi không muốn cài đặt bất cứ thứ gì trên hệ thống của mình THX yael

5
@yael: sau đó bạn cần cập nhật câu hỏi ban đầu của mình để bao gồm ràng buộc này , KHÔNG chỉ lặp lại câu hỏi và bắt đầu lại từ đầu
Paul R

Câu trả lời:


11

Bạn có thể sử dụng tim Friit , nó có sẵn trong Ubuntu mặc định hoặc bạn có thể tự biên dịch nó.

tim Friit thực thi một lệnh và chấm dứt quá trình sinh sản sau một thời gian nhất định với một tín hiệu nhất định. Tín hiệu cảnh báo của người Viking được gửi trước, sau đó, sau khi hết thời gian, tín hiệu giết chết của người Viking, tương tự như cách init (8) hoạt động khi tắt máy.


2
Nó không có trong Ubuntus của tôi (máy tính để bàn 10.10, máy chủ 11.04) nên có lẽ không phải là mặc định. Nhưng dễ dàng lấy một cách nhanh chóng sudo aptitude install timelimit. Hoạt động tuyệt vời khi cài đặt.
Ngày

7

Đây là một số bash hơi hack cho điều đó:

grep -qsRw -m1 "parameter" /var &

GREPPID=$!

( sleep 30; kill $GREPPID ) &

fg $GREPPID

Về cơ bản, nó bắt đầu tìm kiếm trong nền, sau đó bắt đầu một lớp con chờ 30 giây và sau đó giết quá trình tìm kiếm. Nếu tìm kiếm mất <30 giây, quá trình sẽ bị chết. Không phải là một ý tưởng tuyệt vời để giết một quá trình đã chết vì có một cơ hội rất nhỏ, một cái gì đó khác sẽ sử dụng lại pid, nhưng đối với một cái gì đó như thế này nói chung là ổn. Cuối cùng, tìm kiếm được đưa trở lại trong nền trước và sẽ chạy cho đến khi nó kết thúc hoặc bị giết.


Làm thế nào để có được $? từ grep trong trường hợp này bởi vì trong kịch bản của tôi, tôi lấy $? từ grep và xác minh nếu grep khớp với chuỗi? yael

Tôi không chắc chắn có một cách đơn giản để làm điều đó. Hơn nữa, cách tiếp cận này không hoạt động trong một kịch bản trong đó bash không có kiểm soát công việc hoạt động. Bạn có thể phải dùng đến một chút hack Perl để hoàn thành công việc trong một kịch bản. Hmm ...
Walter Mundt

Có thể đến câu hỏi này để perl? Yael

4

Tạo một tệp mới gọi là "tgrep" và đặt vào đó như sau (hoặc gọi nó là bất cứ điều gì bạn muốn):

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

Tiếp theo, chạy chmod a+x tgrep. Bây giờ nếu bạn muốn sử dụng nó, bạn có thể gõ

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

Hoặc bạn chỉ có thể sử dụng nó dưới dạng tgrep (không có ./ và có thể sử dụng nó từ bất kỳ thư mục nào) nếu bạn đặt nó trong một thư mục chứa trong biến $ PATH của bạn (như / home / dan / bin /, nếu đó là trong biến $ PATH của bạn, nếu không bạn có thể thêm nó).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.