มีทางเลือกอื่นสำหรับคำสั่งการหมดเวลาบน Mac OSx หรือไม่ ข้อกำหนดพื้นฐานคือฉันสามารถรันคำสั่งตามระยะเวลาที่กำหนด
เช่น:
timeout 10 ping google.com
โปรแกรมนี้รัน ping เป็นเวลา 10 วินาทีบน Linux
มีทางเลือกอื่นสำหรับคำสั่งการหมดเวลาบน Mac OSx หรือไม่ ข้อกำหนดพื้นฐานคือฉันสามารถรันคำสั่งตามระยะเวลาที่กำหนด
เช่น:
timeout 10 ping google.com
โปรแกรมนี้รัน ping เป็นเวลา 10 วินาทีบน Linux
คำตอบ:
คุณสามารถใช้ได้
brew install coreutils
และเมื่อใดก็ตามที่คุณต้องการหมดเวลาให้ใช้
gtimeout
..แทน. เพื่ออธิบายว่าเหตุใดจึงเป็นตัวอย่างจากส่วน Homebrew Caveats:
ข้อควรระวัง
คำสั่งทั้งหมดได้รับการติดตั้งด้วยคำนำหน้า "g"
หากคุณจำเป็นต้องใช้คำสั่งเหล่านี้กับชื่อปกติคุณสามารถเพิ่มไดเร็กทอรี "gnubin" ไปยัง PATH จาก bashrc ของคุณเช่น:
PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"
นอกจากนี้คุณสามารถเข้าถึง man page ด้วยชื่อปกติได้หากคุณเพิ่มไดเร็กทอรี "gnuman" ลงใน MANPATH จาก bashrc ของคุณด้วย:
MANPATH="/usr/local/opt/coreutils/libexec/gnuman:$MANPATH"
ln -s /usr/local/bin/gtimeout /usr/local/bin/timeout
เพื่อเปิดใช้งานคำสั่งเดียว (โซลูชันนามแฝงใช้ได้กับการใช้ CLI แบบโต้ตอบ แต่ไม่ใช่เมื่อเรียกจากสคริปต์ทุบตี)
brew install coreutils
และtimeout
คำสั่งสามารถใช้ได้โดยไม่มีคำนำหน้า
อีกวิธีง่ายๆที่ทำงานข้ามแพลตฟอร์มได้ค่อนข้างมาก (เพราะใช้ perl ซึ่งมีอยู่เกือบทุกที่) คือ:
function timeout() { perl -e 'alarm shift; exec @ARGV' "$@"; }
ขัดขวางจากที่นี่: https://gist.github.com/jaytaylor/6527607
แทนที่จะใส่ไว้ในฟังก์ชันคุณสามารถใส่บรรทัดต่อไปนี้ในสคริปต์และมันก็ใช้ได้เช่นกัน:
perl -e 'alarm shift; exec @ARGV' "$@";
หรือเวอร์ชันที่สร้างขึ้นในวิธีใช้ / ตัวอย่าง:
#!/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"
?
function timeout() { perl -e 'use Time::HiRes "ualarm"; ualarm shift; exec @ARGV' "$@"; }
(โปรดทราบว่าต้องใช้ Perl> = 5.8 ตามperldoc.perl.org/functions/alarm.html )
คุณสามารถ จำกัด เวลาดำเนินการของโปรแกรมใด ๆ โดยใช้คำสั่งนี้:
ping -t 10 google.com & sleep 5; kill $!
แพ็คเกจ Timeout จาก Ubuntu / Debian สามารถคอมไพล์บน Mac และใช้งานได้ แพคเกจมีอยู่ที่http://packages.ubuntu.com/lucid/timeout
brew install coreutils
- จากนั้นใช้gtimeout
หรือตั้งค่า PATH ของคุณเพื่อใช้timeout
ชื่อ
คุณทำได้ ping -t 10 google.com >nul
the> nul กำจัดเอาต์พุต ดังนั้นแทนที่จะแสดง 64 BYTES จาก 123.45.67.8 BLAH BLAH BLAH มันจะแสดงบรรทัดใหม่ว่างจนกว่าจะหมดเวลา แฟล็ก -t สามารถเปลี่ยนเป็นตัวเลขใดก็ได้