Lệnh Bash Run trong thời gian nhất định?


12

Tôi đang làm bash script để sử dụng. Làm thế nào tôi có thể chạy một lệnh trong một thời gian nhất định, như 20 giây và chấm dứt lệnh? Tôi đã thử rất nhiều giải pháp nhưng không có gì hiệu quả, tôi cũng đã thử lệnh hết thời gian không thành công. Xin vui lòng cho tôi một số giải pháp cho việc này.

ví dụ: Tôi muốn chạy lệnh này trong tập lệnh và thiết bị đầu cuối sau 10 giây

some command

Câu trả lời:


14

Hừm, nên làm mánh khóe:

xmessage "Hello World" &
pidsave=$!
sleep 10; kill $pidsave

xmessagecung cấp một trường hợp thử nghiệm nhanh ở đây (trong trường hợp của bạn, lệnh airodump sẽ đến đó); &đặt nó vào nền.

$!giữ PID của quá trình bắt đầu gần nhất (xem ví dụ /programming//a/1822042/2037712 ); PID được lưu vào biến pidsave.

Sau khi chờ đợi ( sleep), gửi TERMtín hiệu cho quá trình.


Cảm ơn bạn thân nó hoạt động nhưng bây giờ tôi có 1 vấn đề. Tôi muốn xem đầu ra được tạo bởi lệnh nhưng cửa sổ xmessage không hiển thị gì cả.
Umair Riaz

@UmairRiaz: xmessage chỉ là một ví dụ. Để điều chỉnh ví dụ của bạn trong câu hỏi và ghi nhật ký đầu ra của lệnh sử dụng some command > logfile &trong dòng đầu tiên. Sau đó bạn có thể phân tích logfile.
mpy

4

Từ dấu nhắc bash, bạn có thể sử dụng "

  • your_command & sleep 20; kill $!
  • Hoặc sử dụng lệnh hết thời gian: Eg aptget install timeouttimeout -k 3m 14s your_command
  • Hoặc sử dụng expectnhư được giải thích tại đây: /unix/43340/how-to-int sinhe-timeout-for-shell-scripting
  • hoặc làm điều đó với perl: perl -e "alarm 10; exec @ARGV" "Your_command"
  • Hoặc sử dụng giải pháp khó hiểu hơn này: $COMMAND 2>&1 >/dev/null & WPID=$!; sleep $TIMEOUT && kill $! & KPID=$!; wait $WPID( Nguồn và giải thích )

1

Một cách khác là sử dụng mẫu pgrep $, hoặc mẫu pkill $; trả về tất cả các PID phù hợp với mẫu đã cho, xem qua tất cả các quy trình đang chạy trên máy. Vì vậy, để giới hạn phạm vi của PID chỉ với những người bạn sở hữu, hãy sử dụng: pgrep -P $ mypid $ mẫu hoặc pkill -P $ mypid $ mẫu

Vì vậy, để chạy quy trình nền trong một khoảng thời gian đã đặt, tập lệnh của bạn sẽ trông giống như thế này:

#!/bin/bash 
mypid=$$
run_something &
sleep $time_in_seconds
pkill -P $mypid something

Hãy nhớ rằng điều này sẽ giết tất cả các quy trình có cùng một mẫu tên chạy theo bộ cha mẹ hiện tại. Vì vậy, bạn có thể sử dụng điều này để bắt đầu nhiều quy trình và đồng thời tiêu diệt tất cả chúng sau một thời gian nhất định.

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.