Có thể in thời gian thực hiện của một lệnh shell với sự kết hợp sau đây không?
root@hostname:~# "command to execute" && echo "execution time"
Câu trả lời:
Đừng quên rằng có một sự khác biệt giữa nội trang của bash time
(sẽ được gọi theo mặc định khi bạn làm như vậy time command
) và /usr/bin/time
(sẽ yêu cầu bạn gọi nó theo đường dẫn đầy đủ của nó).
Nội trang time
luôn in ra stderr, nhưng /usr/bin/time
sẽ cho phép bạn gửi đầu ra của thời gian tới một tệp cụ thể, vì vậy bạn không can thiệp vào luồng stderr của lệnh đã thực thi. Ngoài ra, /usr/bin/time
định dạng của có thể được định cấu hình trên dòng lệnh hoặc bởi biến môi trường TIME
, trong khi time
định dạng nội trang của bash chỉ được định cấu hình bởi TIMEFORMAT
biến môi trường.
$ 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
vì tôi chỉ liếc qua nó và tôi nghĩ đó là một đối số dòng lệnh. Tôi sẽ cập nhật câu trả lời.
time
là một lệnh tích hợp trong hầu hết các shell ghi thông tin thời gian thực thi vào tty.
Bạn cũng có thể thử một cái gì đó như
start_time=`date +%s`
<command-to-execute>
end_time=`date +%s`
echo execution time was `expr $end_time - $start_time` s.
Hoặc trong bash
:
start_time=`date +%s`
<command-to-execute> && echo run time is $(expr `date +%s` - $start_time) s
time
sử dụng mili giây. Và nếu bạn muốn tính thời gian của một số lệnh với nhau mà không cần phải sử dụng các biến và phép tính, bạn có thể sử dụng dấu ngoặc đơn: time ( command1 ; command2 ; command3 )
bạn thậm chí có thể tính thời gian riêng lẻ chúng với nhau với tổng thời gian, như vậy: time ( time command1 ; time command2 ; time command3 )
Tất nhiên, nếu bạn muốn khoảng 20 lệnh, có thể tốt hơn để sử dụng giải pháp của câu trả lời này. Nhưng sau đó, bạn nên bắt đầu nghĩ đến việc đặt tất cả các lệnh của mình trong một tập lệnh ...
root@hostname:~# time [command]
Nó cũng phân biệt giữa thời gian thực được sử dụng và thời gian hệ thống được sử dụng.
time
viết cho tty, không phải stderr. Mà tôi đoán làm cho mọi thứ tồi tệ hơn.
Đối với phép đo delta theo từng dòng, hãy thử gnonom .
Nó là một tiện ích dòng lệnh, giống như ts của moreutils, để thêm thông tin dấu thời gian vào đầu ra tiêu chuẩn của một lệnh khác. Hữu ích cho các quy trình chạy lâu dài nơi bạn muốn ghi lại lịch sử những gì diễn ra trong thời gian dài.
Piping bất kỳ thứ gì đến gnomon sẽ thêm một dấu thời gian vào mỗi dòng, cho biết dòng đó là dòng cuối cùng trong bộ đệm bao lâu - nghĩa là dòng tiếp theo xuất hiện trong bao lâu. Theo mặc định, gnomon sẽ hiển thị số giây trôi qua giữa mỗi dòng, nhưng điều đó có thể định cấu hình.
Nếu tôi đang bắt đầu một quy trình chạy dài như sao chép hoặc băm và tôi muốn biết sau đó mất bao lâu, tôi chỉ cần làm như sau:
$ date; sha1sum reallybigfile.txt; date
Điều này sẽ dẫn đến kết quả sau:
Tue Jun 2 21:16:03 PDT 2015
5089a8e475cc41b2672982f690e5221469390bc0 reallybigfile.txt
Tue Jun 2 21:33:54 PDT 2015
Được, như được triển khai ở đây, nó không chính xác lắm và không tính được thời gian đã trôi qua. Nhưng nó đơn giản và đôi khi là tất cả những gì bạn cần.
Trong zsh bạn có thể sử dụng
=time ...
Trong bash hoặc zsh, bạn có thể sử dụng
command time ...
Những điều này (bởi các cơ chế khác nhau) buộc một lệnh bên ngoài được sử dụng.
Chỉ ps -o etime= -p "<your_process_pid>"
man bash
: "Biến TIMEFORMAT có thể được đặt thành một chuỗi định dạng chỉ định cách hiển thị thông tin thời gian"