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ó 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:
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"
ln -s /usr/local/bin/gtimeout /usr/local/bin/timeout
chỉ 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).
brew install coreutils
và timeout
lệnh có sẵn mà không cần tiền tố.
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:
perl -e 'alarm shift; exec @ARGV' "$@";
hoặc phiên bản đã tích hợp sẵn trợ giúp / ví dụ:
#!/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' "$@";
perl -e 'alarm shift; exec "ping google.com"
nào?
Alarm clock
thô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 .
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 )
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 $!
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
brew install coreutils
- sau đó sử dụng gtimeout
hoặc đặt PATH của bạn để sử dụng timeout
tên.
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.