คำสั่งหมดเวลาบน Mac OS X?


95

มีทางเลือกอื่นสำหรับคำสั่งการหมดเวลาบน Mac OSx หรือไม่ ข้อกำหนดพื้นฐานคือฉันสามารถรันคำสั่งตามระยะเวลาที่กำหนด

เช่น:

timeout 10 ping google.com

โปรแกรมนี้รัน ping เป็นเวลา 10 วินาทีบน Linux


คำตอบ:


139

คุณสามารถใช้ได้

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"

22
จากนั้น: alias timeout = gtimeout
nkadwa

1
หรือln -s /usr/local/bin/gtimeout /usr/local/bin/timeoutเพื่อเปิดใช้งานคำสั่งเดียว (โซลูชันนามแฝงใช้ได้กับการใช้ CLI แบบโต้ตอบ แต่ไม่ใช่เมื่อเรียกจากสคริปต์ทุบตี)
John Y

1
ด้านข้างของฉันหลังจากติดตั้ง coerutils แล้วฉันมีการหมดเวลาเมื่อหมดเวลา: ln -s / usr / local / bin / gtimeout / usr / local / bin / timeout ln: / usr / local / bin / timeout: มีไฟล์อยู่
talsibony

1
อัปเดต: ฉันเพิ่งติดตั้ง coreutils โดยใช้brew install coreutilsและtimeoutคำสั่งสามารถใช้ได้โดยไม่มีคำนำหน้า
tdensmore

25

อีกวิธีง่ายๆที่ทำงานข้ามแพลตฟอร์มได้ค่อนข้างมาก (เพราะใช้ perl ซึ่งมีอยู่เกือบทุกที่) คือ:

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

ขัดขวางจากที่นี่: https://gist.github.com/jaytaylor/6527607

แทนที่จะใส่ไว้ในฟังก์ชันคุณสามารถใส่บรรทัดต่อไปนี้ในสคริปต์และมันก็ใช้ได้เช่นกัน:

timeout.sh

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

หรือเวอร์ชันที่สร้างขึ้นในวิธีใช้ / ตัวอย่าง:

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' "$@";

การใช้งานโดยตรงโดยไม่รวมไว้ในฟังก์ชันจะเป็นอย่างไร
mwfearnley

มันสวยมากแค่ลบฟังก์ชั่นและออกจากบรรทัด perl ... ฉันใส่รายละเอียดเพิ่มเติมไว้ด้านบน
Brad Parks

ซับในแบบใช้ครั้งเดียวมันเป็นยังไง? บางอย่างเช่นperl -e 'alarm shift; exec "ping google.com"?
mwfearnley

แต่น่าเสียดายที่นี้สร้างAlarm clockข้อผิดพลาดเมื่อหมดเวลาและขจัดนี้ได้รับยุ่ง
RichVel

1
จะเป็นการดีที่จะเพิ่มเวอร์ชัน ualarm เมื่อคุณต้องการความแม่นยำมากขึ้น: function timeout() { perl -e 'use Time::HiRes "ualarm"; ualarm shift; exec @ARGV' "$@"; } (โปรดทราบว่าต้องใช้ Perl> = 5.8 ตามperldoc.perl.org/functions/alarm.html )
gib

7

คุณสามารถ จำกัด เวลาดำเนินการของโปรแกรมใด ๆ โดยใช้คำสั่งนี้:

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

9
นี่คงไม่ใช่สิ่งที่คุณต้องการ ผลลัพธ์คือคำสั่งจะทำงานตรง 5 วินาที หมายความว่าถ้าคุณต้องการให้เป็นเวลาสูงสุด แต่ไม่ใช่ขั้นต่ำนี่ไม่ใช่สิ่งที่คุณกำลังมองหา
gesell

2

แพ็คเกจ Timeout จาก Ubuntu / Debian สามารถคอมไพล์บน Mac และใช้งานได้ แพคเกจมีอยู่ที่http://packages.ubuntu.com/lucid/timeout


2
วิธีที่ง่ายกว่าคือใช้ Homebrew: brew install coreutils- จากนั้นใช้gtimeoutหรือตั้งค่า PATH ของคุณเพื่อใช้timeoutชื่อ
RichVel

1

คุณทำได้ ping -t 10 google.com >nul

the> nul กำจัดเอาต์พุต ดังนั้นแทนที่จะแสดง 64 BYTES จาก 123.45.67.8 BLAH BLAH BLAH มันจะแสดงบรรทัดใหม่ว่างจนกว่าจะหมดเวลา แฟล็ก -t สามารถเปลี่ยนเป็นตัวเลขใดก็ได้


2
ปิงเป็นตัวอย่างจริงๆ ฉันต้องการเรียกใช้โปรแกรมเพื่อรวบรวมเมตริก
sheki
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.