Начини на плащане Abuse

Командата Time в Linux

18.03.2022, 01:39

Понякога, когато работите с терминала на Linux, трябва да знаете времето на изпълнение на определени команди, например, за да откриете проблеми. За тази цел има помощна програма, наречена time. Ще ви разкажем как работи командата time в Linux и какъв е нейният синтаксис. След това ще преминем към описание на наличните опции. А накрая ще споменем някои популярни сценарии за използване.

Синтаксис и опции

Помощната програма изпълнява дефинирана от потребителя команда и след това показва информация за времето на нейното изпълнение. Синтаксисът ѝ е доста удобен. Най-напред трябва да посочите опциите за време, след това командата, която трябва да се изпълни, и накрая аргументите към нея:

$ time [options] command_to_execute [arguments]

Нека разгледаме списъка с наличните опции:

  • -o, --output - записва данните в избрания файл вместо в стандартния изход в терминала. В този случай старите данни във файла ще бъдат презаписани.
  • -a, --append - добавя нова информация към файла, вместо да презаписва старата. Опцията е полезна само в комбинация с -o.
  • -f, --format - избира конкретен изходен формат. Подробности за форматирането са описани в следващия раздел на тази статия.
  • -p, --profitably - използвайте формат за извеждане на данни, който да съответства на стандарта POSIX 1003.2.
  • -v, --verbose - извежда подробна информация за изпълнението на програмата.
  • -V, --version - извежда версията на програмата за време.

Този списък съдържа само основните опции. Можете да получите подробна информация с командата:

$ man time

Опции за форматиране на изхода

По подразбиране програмата time може да извежда информация във вид, който не е удобен за четене,

Желателно е да се зададат опции за форматиране на изхода, които ще бъдат разгледани сега. Те са общо три. Нека вземем за пример командата apt-get update.

Опцията -v се използва за извеждане на подробна информация:

$ sudo time -v apt-get update

Опцията -p е необходима за извеждане на данните във формат, съвместим с POSIX 1003.2:

$ sudo time -p apt-get update

Редът за форматиране на данните обикновено включва спецификатори на ресурси и обикновен текст. Знакът % показва, че следващият го символ трябва да се третира като спецификатор на ресурси.

Знакът се използва за определяне на разделителния символ. Има три налични опции: t - табулация, n - нов ред, \ - обратна наклонена черта. Ако посочите друг знак след , терминалът ще покаже въпросителен знак (?), който показва грешка при въвеждане.

Останалата част от текста във форматиращия низ се копира изцяло в изходното поле. В този случай time винаги започва да извежда данни от нов ред след информацията за изпълнението на самата команда.

Нека да разгледаме наличните спецификатори на ресурси:

  • т.е. за да изведете знак за процент, трябва да посочите%% в командата.
  • C - име на командата и използвани аргументи.
  • D - среден размер на неразделената област от данни. Той се извежда в килобайти.
  • E - реално време на изпълнение на командата в обичайния формат на часа. Показва се като [часове:]<минути:секунди.
  • N - брой на основните или входно-изходните грешки, които са възникнали по време на изпълнението на процеса.
  • I - брой достъпи до файловата система.
  • K - средна стойност на паметта, използвана за код(text), инициализирани данни(data) истек (stack). Показва се в килобайти.
  • M - максимален размер на резидентния набор по време на изпълнението на процеса в килобайти.
  • O - брой на излизанията от файловата система.
  • P - процент на натоварване на централния процесор (CPU, central processing unit).
  • R - брой на незначителните грешки.
  • S - време в секунди, през което централният процесор е бил използван от системата от името на процеса в режим супервайзор (режим наядрото).
  • U - време в секунди, през което процесорът е бил използван от процеса директно впотребителски режим.
  • W - колко пъти процесът е бил разтоварван от оперативната памет.
  • Z - размер на системната страница. Тази стойност е константа, но варира в различните системи.
  • C - брой на принудителните превключвания на контекста по време на изпълнението на процеса.
  • e - реално време на изпълнение на командата в обичайния формат на часа. Показва се в секунди.
  • k - брой на сигналите, които са достигнали до процеса.
  • p - среден размер на несподеления стек на процеса, в килобайти.
  • r - брой на получените съобщения от сокети.
  • s - брой на изпратените съобщения от сокети.
  • t - среден размер на резидентния набор на процеса, в килобайти.
  • w - брой доброволни превключвания на контекста по време на изпълнението на процеса
  • x - код за връщане на командата.

Това бяха всички ресурсни спецификатори, използвани при избора на форматиране за времето. Сега нека преминем към сценариите за използване на командата.

Време за изпълнение на командата LINUX

Нека разгледаме три основни примера, които се използват доста често: извеждане на терминал, извеждане в отделен файл и извеждане с форматиране.

Извеждане на времето за изпълнение на терминал

Като пример ще вземем командата sleep, която поставя на пауза изпълнението на програмата за определено време. Това ще бъде много ясен пример, защото времето на паузата ще съвпадне с времето на изпълнение на командата във времето:

$ time sleep 3

Времето се изписва веднага в три колони. Нека да разгледаме всяка от тях:

реално - общото време от началото на изпълнението на процеса до неговото завършване.

user (потребител) - времето, през което процесът е бил изпълняван впотребителски режим.

sys - времето, през което процесът е участвал в режим супервайзор (режим наядрото).

Следващият полезен сценарий е извеждането на времето, необходимо за зареждане на заглавието на уеб страница чрез обслужващата програма curl. Нека вземем за пример нашия уебсайт:

$ time curl -I https://losst.ru

Трябва да споменем ситуация, при която изпълнението на командата поставя терминалния прозорец в различен режим, например когато стартирате редактора nano, за да промените файла /home/root-user/script.txt:

$ time nano /home/root-user/scripts/main_script.txt

След като редакторът завърши, ще видите общото време, през което сте работили върху файла.

Вече знаете как да видите времето за изпълнение на дадена Linux команда.

Изход на файла

Информацията за резултатите от изпълнението на командата time може да бъде записана в отделен файл с помощта на опцията-o. В този случай те няма да се показват в прозореца на терминала. Нека вземем за пример извличането на съдържанието на архива ~/data/data.tar.gz с помощта на помощната програма tar. Нека запишем информацията за времето на изпълнение в нов файл ~/data/data_data_time.txt. Ще добавим и опцията-v към командата, за да получим подробна информация:

$ sudo time -v -o ~/data/data_time.txt tar -xvf ~/data/data.tar.gz -C ~/data

Файлът ще има следното съдържание.

Ако използвате опцията -o, не забравяйте, че тя презаписва старата информация в изходния файл с новата информация. Това е приложимо при създаване на нови файлове, но не е подходящо за регистриране. С незадължителната опция -a презаписването на съдържанието се заменя с добавяне на нова информация:

$ sudo time -v -a -o ~/data/data_time.txt tar -xvf ~/data/data.tar.gz -C ~/data

Изход с форматиране

Първоначалната опция за форматиране на данните не е подходяща във всички случаи. Като пример ще вземем използваната преди това команда за извличане на архив, но няма да записваме данните във файл. Когато я изпълняваме, се интересуваме от:

  • Информация за самата команда и зададените опции - този спецификатор%C.
  • Натоварване на процесора - спецификатор%P.
  • Общо време за изпълнение в секунди - спецификатор%e.

За по-удобно възприемане всеки елемент ще бъде показан на отделен ред с помощта на разделителя n. В същото време всички те ще бъдат подписани по разбираем начин.

Ето как изглежда окончателният вариант на командата:

sudo time -f "Command info:n%CnCPU usage: %PnExecution time: %e sec" tar -xvf ~/data/data.tar.gz -C ~/data

Целият текст, с изключение на символите след %, се извежда изцяло в терминала. Това е удобен начин за маркиране на