เป็นไปได้ไหมที่จะพิมพ์เวลาดำเนินการของคำสั่งเชลล์ด้วยชุดค่าผสมต่อไปนี้
root@hostname:~# "command to execute" && echo "execution time"
เป็นไปได้ไหมที่จะพิมพ์เวลาดำเนินการของคำสั่งเชลล์ด้วยชุดค่าผสมต่อไปนี้
root@hostname:~# "command to execute" && echo "execution time"
คำตอบ:
อย่าลืมว่ามีความแตกต่างระหว่าง builtin ของ bash time(ซึ่งควรถูกเรียกโดยค่าเริ่มต้นเมื่อคุณทำtime command) และ/usr/bin/time(ซึ่งควรกำหนดให้คุณเรียกใช้ตามเส้นทางแบบเต็ม)
builtin timeจะพิมพ์ไปที่ stderr เสมอ แต่/usr/bin/timeจะช่วยให้คุณสามารถส่งเอาต์พุตของเวลาไปยังไฟล์เฉพาะได้ดังนั้นคุณจึงไม่ยุ่งเกี่ยวกับสตรีม stderr ของคำสั่งที่ดำเนินการ นอกจากนี้/usr/bin/time's รูปแบบที่กำหนดในบรรทัดคำสั่งหรือโดยตัวแปรสภาพแวดล้อมTIMEในขณะที่ builtin ทุบตีของtimeรูปแบบเป็นเพียงการกำหนดค่าโดยTIMEFORMATตัวแปรสภาพแวดล้อม
$ time factor 1234567889234567891 # builtin
1234567889234567891: 142662263 8653780357
real 0m3.194s
user 0m1.596s
sys 0m0.004s
$ /usr/bin/time factor 1234567889234567891
1234567889234567891: 142662263 8653780357
1.54user 0.00system 0:02.69elapsed 57%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+215minor)pagefaults 0swaps
$ /usr/bin/time -o timed factor 1234567889234567891 # log to file `timed`
1234567889234567891: 142662263 8653780357
$ cat timed
1.56user 0.02system 0:02.49elapsed 63%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+217minor)pagefaults 0swaps
help timeเพราะฉันมองไปที่มันเท่านั้นและฉันคิดว่ามันเป็นอาร์กิวเมนต์บรรทัดคำสั่ง ฉันจะอัปเดตคำตอบ
time เป็นคำสั่งในตัวในเชลล์ส่วนใหญ่ที่เขียนข้อมูลเวลาดำเนินการไปยัง tty
คุณสามารถลองทำสิ่งต่างๆเช่น
start_time=`date +%s`
<command-to-execute>
end_time=`date +%s`
echo execution time was `expr $end_time - $start_time` s.
หรือในbash:
start_time=`date +%s`
<command-to-execute> && echo run time is $(expr `date +%s` - $start_time) s
timeใช้มิลลิวินาที และถ้าคุณต้องการรวมคำสั่งจำนวนหนึ่งเข้าด้วยกันโดยไม่ต้องใช้ตัวแปรและการคำนวณคุณสามารถใช้วงเล็บ: time ( command1 ; command2 ; command3 )คุณอาจกำหนดเวลาทีละคำพร้อมกันด้วยเวลาทั้งหมดเช่น: time ( time command1 ; time command2 ; time command3 ) แน่นอนว่าถ้าคุณต้องการ 20 คำสั่งอาจ ควรใช้คำตอบนี้ดีกว่า แต่คุณควรเริ่มคิดว่าจะใส่คำสั่งทั้งหมดลงในสคริปต์ ...
root@hostname:~# time [command]
นอกจากนี้ยังแยกความแตกต่างระหว่างเวลาจริงที่ใช้และเวลาของระบบที่ใช้
timeเขียนถึง tty ไม่ใช่ stderr ซึ่งฉันเดาว่าทำให้สิ่งต่างๆแย่ลง
สำหรับบรรทัดโดยบรรทัดวัดเดลต้าลองgnonom
เป็นยูทิลิตี้บรรทัดคำสั่งเช่นเดียวกับ ts ของ moreutils เพื่อเพิ่มข้อมูลการประทับเวลาล่วงหน้าไปยังเอาต์พุตมาตรฐานของคำสั่งอื่น มีประโยชน์สำหรับกระบวนการทำงานที่ยาวนานซึ่งคุณต้องการบันทึกทางประวัติศาสตร์ว่าอะไรใช้เวลานานมาก
การวางสิ่งใด ๆ ลงใน gnomon จะเพิ่มการประทับเวลาของแต่ละบรรทัดโดยระบุว่าบรรทัดนั้นเป็นบรรทัดสุดท้ายในบัฟเฟอร์นานเท่าใดนั่นคือระยะเวลาที่บรรทัดถัดไปจึงจะปรากฏ ตามค่าเริ่มต้น gnomon จะแสดงวินาทีที่ผ่านไประหว่างแต่ละบรรทัด แต่สามารถกำหนดค่าได้
การเพิ่มคำตอบของ @ mob:
ท้าย%Nที่จะdate +%sช่วยให้เรามีความถูกต้อง nanosecond:
start=`date +%s%N`;<command>;end=`date +%s%N`;echo `expr $end - $start`
หากฉันกำลังเริ่มกระบวนการที่ใช้เวลานานเช่นการคัดลอกหรือแฮชและฉันต้องการทราบในภายหลังว่าใช้เวลานานแค่ไหนฉันก็ทำสิ่งนี้:
$ date; sha1sum reallybigfile.txt; date
ซึ่งจะให้ผลลัพธ์ดังต่อไปนี้:
Tue Jun 2 21:16:03 PDT 2015
5089a8e475cc41b2672982f690e5221469390bc0 reallybigfile.txt
Tue Jun 2 21:33:54 PDT 2015
จริงอยู่ที่นำมาใช้ที่นี่มันไม่แม่นยำมากและไม่ได้คำนวณเวลาที่ผ่านไป แต่มันก็เป็นเรื่องง่ายและบางครั้งคุณก็ต้องการ
ใน zsh คุณสามารถใช้ไฟล์
=time ...
ใน bash หรือ zsh คุณสามารถใช้ได้
command time ...
สิ่งเหล่านี้ (โดยกลไกที่แตกต่างกัน) บังคับให้ใช้คำสั่งภายนอก
แค่ ps -o etime= -p "<your_process_pid>"
man bash: "ตัวแปร TIMEFORMAT อาจถูกตั้งค่าเป็นสตริงรูปแบบที่ระบุวิธีแสดงข้อมูลเวลา"