เป็นไปได้ไหมที่จะพิมพ์เวลาดำเนินการของคำสั่งเชลล์ด้วยชุดค่าผสมต่อไปนี้
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 อาจถูกตั้งค่าเป็นสตริงรูปแบบที่ระบุวิธีแสดงข้อมูลเวลา"