Lệnh hết thời gian trên Mac OS X?


90

Có giải pháp thay thế cho lệnh timeout trên Mac OSx không. Yêu cầu cơ bản là tôi có thể chạy một lệnh trong một khoảng thời gian nhất định.

ví dụ:

timeout 10 ping google.com

Chương trình này chạy ping trong 10 giây trên Linux.


Câu trả lời:


134

Bạn có thể dùng

brew install coreutils

Và sau đó bất cứ khi nào bạn cần thời gian chờ, hãy sử dụng

gtimeout

..thay thế. Để giải thích lý do tại sao đây là một đoạn trích từ phần Homebrew Caveats:

Cảnh báo

Tất cả các lệnh đã được cài đặt với tiền tố 'g'.

Nếu bạn thực sự cần sử dụng các lệnh này với tên thông thường của chúng, bạn có thể thêm thư mục "gnubin" vào PATH từ bashrc của bạn như:

PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"

Ngoài ra, bạn có thể truy cập trang người đàn ông của họ bằng tên bình thường nếu bạn thêm thư mục "gnuman" vào MANPATH từ bashrc của bạn:

MANPATH="/usr/local/opt/coreutils/libexec/gnuman:$MANPATH"

22
Sau đó: alias timeout = gtimeout
nkadwa

1
Hoặc ln -s /usr/local/bin/gtimeout /usr/local/bin/timeoutchỉ bật một lệnh (giải pháp bí danh hoạt động để sử dụng CLI tương tác, nhưng không hoạt động khi được gọi từ các tập lệnh bash).
John Y

1
Về phía tôi sau khi cài đặt coerutils, tôi có thời gian chờ sẵn có khi hết thời gian chờ: ln -s / usr / local / bin / gtimeout / usr / local / bin / timeout ln: / usr / local / bin / timeout: Tệp tồn tại
talsibony

Cập nhật: Tôi vừa cài đặt coreutils bằng cách sử dụng brew install coreutilstimeoutlệnh có sẵn mà không cần tiền tố.
tdensmore

24

Một cách tiếp cận đơn giản khác hoạt động khá nhiều nền tảng (vì nó sử dụng perl gần như ở khắp mọi nơi) là:

function timeout() { perl -e 'alarm shift; exec @ARGV' "$@"; }

Lấy từ đây: https://gist.github.com/jaytaylor/6527607

Thay vì đặt nó trong một hàm, bạn chỉ có thể đặt dòng sau vào một tập lệnh và nó cũng sẽ hoạt động:

timeout.sh

perl -e 'alarm shift; exec @ARGV' "$@";

hoặc phiên bản đã tích hợp sẵn trợ giúp / ví dụ:

timeout.sh

#!/usr/bin/env bash

function show_help()
{
  IT=$(cat <<EOF

Runs a command, and times out if it doesnt complete in time

Example usage:
 
   # Will fail after 1 second, and shows non zero exit code result
   $ timeout 1 "sleep 2" 2> /dev/null ; echo \$?
   142

   # Will succeed, and return exit code of 0.
   $ timeout 1 sleep 0.5; echo \$?
   0

   $ timeout 1 bash -c 'echo "hi" && sleep 2 && echo "bye"' 2> /dev/null; echo \$?
   hi
   142

   $ timeout 3 bash -c 'echo "hi" && sleep 2 && echo "bye"' 2> /dev/null; echo \$?
   hi
   bye
   0
EOF
)
  echo "$IT"
  exit
}

if [ "$1" == "help" ]
then
  show_help
fi
if [ -z "$1" ]
then
  show_help
fi

#
# Mac OS-X does not come with the delightfully useful `timeout` program.  Thankfully a rough BASH equivalent can be achieved with only 2 perl statements.
#
# Originally found on SO: http://stackoverflow.com/questions/601543/command-line-command-to-auto-kill-a-command-after-a-certain-amount-of-time
# 
perl -e 'alarm shift; exec @ARGV' "$@";

Nó trông như thế nào khi sử dụng nó trực tiếp mà không cần gói nó trong một hàm?
mwfearnley

nó khá nhiều chỉ cần loại bỏ chức năng và để lại dòng perl ... Tôi trình bày thêm chi tiết ở trên!
Brad Parks

Nó trông như thế nào khi một lớp lót sử dụng một lần? Một cái gì đó như thế perl -e 'alarm shift; exec "ping google.com"nào?
mwfearnley

Thật không may, điều này tạo ra một Alarm clockthông báo khi bộ hẹn giờ hết hạn và việc loại bỏ điều này sẽ trở nên lộn xộn .
RichVel

1
Sẽ rất tốt nếu bạn thêm phiên bản ualarm khi bạn cần độ chính xác cao hơn: function timeout() { perl -e 'use Time::HiRes "ualarm"; ualarm shift; exec @ARGV' "$@"; } (Lưu ý rằng nó yêu cầu Perl> = 5,8 theo perldoc.perl.org/functions/alarm.html )
gib,

6

Bạn có thể giới hạn thời gian thực thi của bất kỳ chương trình nào bằng lệnh này:

ping -t 10 google.com & sleep 5; kill $!

9
Đây có lẽ không phải là điều bạn muốn. Kết quả là lệnh sẽ chạy đúng 5 giây. Nghĩa là, nếu bạn muốn nó được một thời gian tối đa nhưng không còn là phút này không phải là những gì bạn đang tìm kiếm
Gesell

2

Gói Timeout từ Ubuntu / Debian có thể được tạo để biên dịch trên Mac và nó hoạt động. Gói này có tại http://packages.ubuntu.com/lucid/timeout


2
Một cách dễ dàng hơn là sử dụng Homebrew: brew install coreutils- sau đó sử dụng gtimeouthoặc đặt PATH của bạn để sử dụng timeouttên.
RichVel

1

Bạn có thể làm ping -t 10 google.com >nul

the> nul thoát khỏi đầu ra. Vì vậy, thay vì hiển thị 64 BYTES TỪ 123.45.67.8 BLAH BLAH BLAH, nó sẽ chỉ hiển thị một dòng mới trống cho đến khi hết thời gian. -t cờ có thể được thay đổi thành bất kỳ số nào.


2
Ping thực sự là một mẫu. Tôi muốn chạy một chương trình để thu thập một số chỉ số
sheki
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.