Советы по UNIX: Увеличение производительности

Полезные секреты командной строки для повышения производительности в офисе

Использование UNIX® в повседневной офисной работе не должно быть неудобным. Узнайте о некоторых простых и сложных способах использования возможностей оболочки UNIX и доступных системных инструментов для значительного повышения производительности работы офиса.

Михаэль Штутц, писатель, консультант

Михаэль Штутц (Michael Stutz) - автор книги The Linux Cookbook, которую он создал и набрал на компьютере с использованием только программного обеспечения с открытым исходным кодом. Его интересы в работе включают также цифровую публикацию и будущее его книги. Он использует различные версии операционной системы UNIX вот уже 20 лет. Вы можете написать ему на адрес stutz@dsl.org.



08.11.2007

Введение

Язык командной строки UNIX® известен своей гибкостью. За счет набора небольших инструментов и утилит и оболочки для их выполнения, вы можете создать множество точных и сложных задач.

При использовании в офисной работе эти же самые инструменты могут стать могущественным союзником в повышении вашей продуктивности. Многие методики, характерные только для UNIX, могут применяться для решения проблема производительности сотрудника на рабочем месте.

Данная статья предлагает некоторые советы и методы для поддержания производительности офиса за счет работы с командной строкой: как проверять привычки, связанные с использованием данной системы, как рассчитывать время вашей работы, секреты для работы с датами, быстрый и простой способ направить себе напоминание, а также способ для автоматизации повторяющихся взаимодействий.

Рассмотрим ваши ежедневные действия в офисе

Первый шаг повышения производительности офисных работников с использованием командной строки UNIX - тщательное рассмотрение ваших текущих ежедневных привычек. Инструменты и приложения, которые вы регулярно используете, и файлы, к которым вы имеете доступ и которые корректируете, могут дать вам понятие о том, какая однообразная работа занимает у вас много времени -- и которой вы можете избежать.

Обзор используемых вами инструментов

Какие инструменты и приложения вы регулярно используете? Ваши ежедневные рабочие привычки в системе можно легко выявить с помощью встроенной команды history, которая выводит пронумерованный список команд, переданных оболочке во время текущего и предыдущих сеансов. Типичный пример показан в листинге 1.

Листинг 1. Образец вывода встроенной команды history
$ history
1 who
2 ls
3 cd /usr/local/proj
4 ls
5 cd websphere
6 ls
7 ls -l
$

Текущая последовательность действий обычно сохраняется в файле, поэтому она хранится в течение последующих сессий; например, оболочка Korn сохраняет свою историю команд скрытой в файле .sh_history в домашнем каталоге пользователя, а оболочка Bash использует .bash_history. Эти файлы обычно переписываются, когда достигают определенной длины, но у многих оболочек есть переменные для установки максимальной длины истории; у оболочек Korn и Bash имеются переменные HISTSIZE и HISTFILESIZE, которые вы можете установить в файле инициализации (startup) оболочки.

Для получения списка наиболее часто используемых команд следует обработать вывод команды history с помощью sort. Затем использовать awk для выделения названий команд без опций и переменных, и передать отобранный список в uniq для получения пронумерованного списка. В заключение вызовите sort еще раз для сортировки списка по убыванию (сначала наибольшее значение) по первой колонке, которая и является собственно нумерацией. В листинге 2 показан пример данной операции.

Листинг 2. Составление списка команд в истории оболочки по частоте их использования
$ history|awk '{print $2}'|awk 'BEGIN {FS="|"} {print $1}'|sort|uniq -c|sort -r

      4 ls
      2 cd
      1 who
$

Если ваш файл истории действий имеет большой размер, можно запускать периодические проверки, обращаясь к tail -- например, для проверки последней тысячи команд попробуйте

$ history|tail -1000|awk '{print $2}'|awk 'BEGIN {FS="|"} {print $1}'|sort|uniq -c|sort -r

Файлы, к которым вы имеете доступ или которые корректируете

Используйте тот же принцип для работы с файлами, которые вы изменили или к которым у вас был доступ. Для этого используйте утилиту find для определения размещения и просмотра списка всех файлов, к которым у вас был доступ или которые вы изменили в течение определенного периода времени -- сегодня, вчера или в любой день или промежуток времени в прошлом.

Как правило, вы не можете выяснить кто последним имел доступ или изменял файл, поскольку в UNIX данную информацию получить нелегко, но можно просмотреть ваши личные файлы, ограничив поиск только теми файлами, которые содержаться в дереве домашней директории. Также можно ограничить поиск только файлами в директории определенного проекта, за которыми вы наблюдаете или над которыми работаете.

У утилиты find есть несколько флажков, которые помогают в поиске файлов по времени. Они перечислены в таблице 1. Директории не являются обычными файлами, но обращение к ним осуществляется каждый раз, когда вы просматриваете их содержимое или делаете их текущей рабочей директорией, так что исключите их из поиска, используя отрицание и флаг -type.

Таблица 1. Выбранные флажки утилиты find
FlagDescription
-daystartДанный флажок запускается в начале дня.
-atimeВремя, когда к файлу обращались в последний раз -- в днях.
-ctimeВремя, когда последний раз изменялось состояние файла -- в днях.
-mtimeВремя, когда файл последний раз был изменен -- в днях.
-aminВремя, когда к файлу обращались в последний раз -- в минутах. (Это доступно не на всех инструментах.)
-cminВремя, когда последний раз изменялось состояние файла -- в минутах. (Это доступно не на всех инструментах.)
-mminВремя, когда файл последний раз был изменен -- в минутах. (Это доступно не на всех инструментах.)
-typeДанный флажок описывает тип файла, такой как d для директорий.
-userXФайлы, принадлежащие пользователю X.
-groupXФайлы, принадлежащие группе X.
-newerXФайлы, более новые, чем файл X.

Здесь приведен пример составления списка всех файлов в дереве домашней директории, которые были изменены ровно час назад:

$ find ~ -mmin 60 \! -type d

Задать отрицательное значение для флага значит найти соответствие этому значению времени или выбрать более позднее. Например, здесь показано, как составить список всех файлов в дереве домашней директории, которые были изменены ровно час назад или в любое время с того момента:

$ find ~ -mmin -60 \! -type d

Не все инструменты find поддерживают флаги min. Если у вас они не поддерживаются, можно сделать "заплатку", используя touch для создания фиктивного файла, временная метка которого более старая, чем у файла, который вы ищете, и затем искать файлы более новые, чем фиктивный файл, с помощью флага -newer:

$ date
Mon Oct 23 09:42:42 EDT 2006
$ touch -t 10230842 temp
$ ls -l temp
-rw-r--r--    1 joe        joe               0 Oct 23 08:42 temp
$ find ~ -newer temp \! -type d

Специальный флаг -daystart, при его использовании в сочетании с любой из опций дня, считает дни от начала текущего дня, а не от начала дня, когда была выполнена команда. Попробуйте составить список всех ваших файлов, существующих где-либо в системе, к которым обращались в любое время от начала сегодняшнего дня до текущего момента:

$ find / -user `whoami` -daystart -atime -1 \! -type d

Аналогично можно составить список всех файлов в домашней директории, которые были изменены в любое время сегодняшнего дня:

$ find ~ -daystart -mtime -1 \! -type d

Задайте разные значения для различных временных флагов, чтобы изменить время поиска. Вы также можете комбинировать флаги. Например, можно составить список всех файлов в домашней директории, к которым и обращались, и которые изменяли в промежуток времени между сегодняшним днем и этим же днем неделей ранее:

$ find ~ -daystart -atime -7 -mtime -7  \! -type d

Вы также можете найти файлы, основанные на особой дате или пределах времени, измеряемых либо в днях, либо в минутах. Обычный способ для того, чтобы сделать это, - это использовать touch для создания фиктивного файла или файлов, как это было описано раньше.

Когда вы хотите найти файлы, которые подходят под определенный период времени, создайте два фиктивных файла, временные метки которых очерчивают пределы. Затем используйте флажок -newer с более старым файлом и используйте "\! -newer" со вторым файлом.

Например, чтобы найти все файлы в каталоге /usr/share, к которым обращались в августе 2006, попробуйте следующее:

$ touch -d "Aug 1 2006" file.start
$ touch -d "Sep 1 2006" file.end
$ find /usr/share -daystart -newer file.start \! -daystart -newer file.end

В заключение, иногда полезно просматривать содержимое директорий, упорядоченное по времени последнего изменения файлов. Некоторые версии инструмента ls имеют опцию -c, которая сортирует файлы по времени их изменения, показывая сначала самые последние измененные файлы. В сочетании с опциями -l (long-listing) и -t (сортировка по времени изменения) вы можете внимательно просматривать список каталога сначала по самым последним измененным файлам; в длинном списке отображается время изменения файла вместо времени создания по умолчанию:

$ ls -ltc /usr/local/proj/websphere | less

Определите время вашей работы

Другим полезным средством повышения производительности офиса при использовании UNIX является расчет времени для команд, которые вы регулярно выполняете. После этого можно оценить результаты и определить, не слишком ли много времени тратится на ожидание завершения какого-либо процесса.

Выполнение команды расчета времени

Система замедляет вас? Как долго вы ждете, ничего не делая, пока выполняется какая-то определенная команда? Сколько времени у вас занимают обычные утренние типовые задачи?

Вы можете получить точные ответы на эти вопросы, если используете команды date, sleep, и echo для расчета времени работы.

Для расчета времени работы напечатайте длинную строку, в которой первым идет выражение date для вывода времени и даты в желаемом формате (обычно достаточно часов и минут). Затем запустите длинную команду -- это могут быть несколько строк, объединенных директивами оболочки -- и в последнюю очередь подставьте дату в ту же самую строку. Если команды, которые вы тестируете, выдают большое количество данных, перенаправьте их так, чтобы вы могли видеть время и запуска, и остановки команд. Рассчитайте разницу между двумя моментами времени:

$ date; system-backup > /dev/null; system-diag > /dev/null;\
> netstat > /dev/null; df > /dev/null; date

Проверьте скорость вашей печати

Вы можете использовать эти же принципы для проверки вашей скорости печати:

$ date;cat|wc -w;date

Эта команда работает лучше всего, если вы осуществляете длительный ввод с клавиатуры, который длится по меньшей мере минуту, но в идеале три минуты или более. Возьмите разницу в минутах между двумя моментами времени и разделите на количество слов, которое вы напечатали (которое выводится промежуточной командой) для получения среднего количества слов, которое вы печатаете за минуту.

Вы можете автоматизировать это, установив переменные для моментов запуска и остановки и для команды, которая выводит количество слов. Но для того, чтобы сделать это верно, следует быть осторожным, чтобы избежать типичной ошибки в подсчетах при вычитании времени. Расширение GNU для команды date, опция формата %s, избегает таких ошибок -- она выводит количество секунд от начала эпохи UNIX, которое определяется как полночь по универсальному синхронизированному времени 1-го января 1970 года. Затем, вы можете подсчитать время, основанное только на секундах.

Задайте переменную SPEED как вывод команды echo, чтобы установить верное равентство для передачи в инструмент подсчета, такой как bc. Затем, выведите новое выражение echo, которое выдает сообщение о скорости печати:

$ START=`date +%s`;WORDS=`cat|wc -w`; STOP=`date +%s; SPEED=\
> `echo "$WORDS / ( ( $STOP - $START ) / 60 )"|bc`;echo \
> "You have a typing speed of $SPEED words per minute."

Вы можете сделать это в сценарии и затем изменить права доступа для того, чтобы сделать его доступным для всех пользователей, так чтобы другие люди, работающие с системой, тоже могли его использовать, как это показано в листинге 3.

Листинг 3. Пример запуска скрипта typespeed
$ typespeedThe quick brown fox jumped over the lazy dog. The quick brown dog--
                              ...
--jumped over the lazy fox.^D

You have a typing speed of 82.33333333 words per minute.
$

Узнайте о датах

Инструмент date может больше, чем просто отображать текущую системную дату. Вы можете использовать его для получения дня недели, на который выпадает данная дата и для получения дат относительно текущей.

Получите день недели для даты

Другое расширение в системе GNU для команды date, опция -d, пригодится в том случае, когда у вас нет рядом настольного календаря, -- и зачем пользователю UNIX об этом беспокоиться? С этой мощной опцией, можно быстро выяснить, на какой день недели выпадает определенная дата, задав ее как аргумент в кавычках:

$ date -d "nov 22"
Wed Nov 22 00:00:00 EST 2006
$

На этом примере видно, что 22 ноября этого года приходится на среду.

Таким образом, когда предлагают провести важную встречу 22 ноября, вы сразу же узнаете о том, что эта дата приходится на среду - день, когда вы работаете вне офиса.

Получите относительные даты

Опция -d также может давать информацию о датах относительных для текущей -- количество дней или недель либо от нынешнего момента, либо до него (ago). Это можно сделать, поставив в кавычки смещение как аргумент для опции -d.

Представьте, например, что вам нужно узнать дату, которая будет через две недели. Если вы работаете с командной строкой shell, то сразу же получите ответ:

$ date -d '2 weeks'

Существуют другие важные способы использования этой команды. С помощью директивы next можно получить день недели для наступающего дня:

$ date -d 'next monday'

С помощью директивы ago вы можете получить уже прошедшие даты:

$ date -d '30 days ago'

Для получения дат в прошлом следует использовать отрицательные числа:

$ date -d 'dec 14 -2 weeks'

Этот метод годится для того, чтобы поставить себе напоминание на будущую дату в файле сценария или инициализации оболочки, как это показано ниже:

DAY=`date -d '2 weeks' +"%b %d"`
if test "`echo $DAY`" = "Aug 16"; then echo 'Product launch is now two weeks away!'; fi

Поставьте себе напоминания

Используйте имеющиеся в вашем распоряжении инструменты для создания напоминаний в системе -- они занимают меньше места, чем заметки на бумаге, и будут видны в любом месте, где вы зайдете в систему.

Задайте время ухода с работы

Когда вы работаете в системе, легко забыть обо всем. В такой ситуации может помочь инструмент leave, общий для операционной системы AIX® компании IBM и систем Berkeley Software Distribution (BSD) (см. ресурсы).

Задайте команде leave время, когда вам нужно уходить, используя 24-часовой формат HHMM. Она будет запущена в фоновом режиме и за пять минут до указанного времени выведет на терминале напоминание о том, что вам пора уходить. Она сделает это снова за минуту до указанного времени, если вы все еще не вышли из системы, а также в указанное время -- и с этого момента будет выводить напоминания каждую минуту, пока вы не выйдете из системы (или пока не остановите процесс leave). В листинге 4 показан пример. При выходе пользователя из системы процесс leave останавливается.

Листинг 4. Пример работы команды leave
$ leave
When do you have to leave? 1830
Alarm set for Fri Aug  4 18:30. (pid 1735)
$ date +"Time now: %l:%M%p"
Time now: 6:20PM
$
<system bell rings>
You have to leave in 5 minutes.
$ date +"Time now: %l:%M%p"
Time now: 6:25PM
$
<system bell rings>
Just one more minute!
$ date +"Time now: %l:%M%p"
Time now: 6:29PM
$
Time to leave!
$ date +"Time now: %l:%M%p"
Time now: 6:30PM
$
<system bell rings>
Time to leave!
$ date +"Time now: %l:%M%p"
Time now: 6:31PM
$ kill 1735
$ sleep 120; date +"Time now: %l:%M%p"
Time now: 6:33PM
$

Есть возможность задать относительное время. Если вы хотите оставить определенное количество времени от текущего момента, начните временной аргумент, используя +. Таким образом, чтобы получить напоминание об уходе через 2 часа, напечатайте следующее:

$ leave +0200

Чтобы задать количество времени в минутах, поставьте 0 в поле для часов. Например, если вы знаете, что до того, как вам совершенно точно нужно уйти, осталось только 10 минут, напечатайте:

$ leave +0010

Вы также можете установить время ухода в качестве аргумента, что делает команду leave пригодной для помещения в сценарии -- особенно в файлы инициализации оболочки. Например, если вы обычно работаете по расписанию до 17 часов, но по пятницам нужно уходить с работы в 16 часов, можно поставить напоминание на всю неделю в файле инициализации оболочки:

if test "`date +%a`" = "Fri"; then leave 1600; fi

Команду leave можно задать в сценарии инициализации без всяких аргументов. При каждом запуске оболочки вы сможете ввести время, чтобы получить напоминание об уходе; при нажатии клавиши Enter без задания значения, выход из leave осуществляется без установки напоминания.

Отправьте себе напоминание по e-mail

Можно отправить себе напоминание, используя текстовое сообщение. Иногда полезно создать напоминание, которое вы увидите либо позднее во время текущего сеанса, либо в следующий раз, при входе в систему.

Одно время старый elm почтовый агент был объединен с инструментом, который позволял вам посылать заметки, используя e-mail; по существу это был скрипт, который требовал от отправителя тему и текст напоминания. Это легко воспроизводится с помощью испытанного временем способа отправки электронного письма самому себе с помощью инструмента командной строки mailx. (В некоторых системах UNIX mail используется вместо mailx.)

Задайте в качестве аргумента ваш электронный адрес (или имя пользователя в локальной системе, если вы просматриваете в ней почту); затем можно напечатать напоминание в строке Subject, если оно достаточно короткое, как показано в листинге 5. Если напоминание никак не помещается в строке Subject, напечатайте его в теле сообщения. Команда ^D в строке сама выходит из mailx и отправляет почту.

Листинг 5. Пример отправки себе напоминания с командой mailx
$ mailx joe
Subject: Call VP on Monday^D
Cc:
Null message body; hope that's ok
$

Автоматизируйте повторяющиеся взаимодействия

Язык Expect (расширение Tcl/Tk, но возможны также и другие разновидности) используется для написания сценариев, которые запускают сеансы с действующими программами, как если бы скрипт был пользователем, непосредственно использующим программу.

Сценарии Expect помогут вам сэкономить большое количество времени, особенно, когда вы заняты повторяющимися задачами. Expect может взаимодействовать с многочисленными программами, включая оболочки и Web-браузеры с текстовым интерфейсом, запускать удаленные сеансы и работать в сети.

Например, если вы постоянно подключаетесь к системе в своей локальной сети для запуска какой-то определенной программы -- команды test-servers, например, -- можно автоматизировать этот процесс с помощью Expect-сценария с названием servmaint, содержимое которого показано в листинге 6.

Листинг 6. Образец Expect скрипта для автоматизации выполнения удаленной системной программы
#!/usr/bin/expect -f
spawn telnet webserv4
expect "login:"
send "joe\r"
expect "Password:"
send "secret\r"
expect "webserv4>$"
send "test-servers\r"
expect "webserv4>$"
send "bye\r"
expect eof

Теперь вам не нужно проходить весь процесс запуска telnet для подключения к удаленной системе, входа в систему, используя свои имя пользователя и пароль, запуска команды/команд в этой системе и выхода из системы. Вы просто запускаете скрипт servmaint, как это показано в листинге 6; все остальное будет сделано за вас. Само собой, если вы задаете пароль или какую-либо другую личную информацию в сценарии, то по соображениям безопасности, по меньшей мере, вы должны изменить разрешение на доступ к файлу так, чтобы вы были единственным пользователем (помимо привелигированного пользователя), который может его читать.

Любое повторяющееся задание, вовлекающее взаимодействие системы, может быть запрограммировано в Expect -- он имеет возможности ветвления, условные зависимости и все другие свойства языка программирования высокого уровня, так что ответ и управление взаимодействием с программой/программами может быть полностью автоматизировано.


Заключение

В офисе системы UNIX могут выполнять многие задания, которые обычно обрабатываются автономными компьютерами с другими операционными системами; с их мощной поддержкой инструментов командной строки они могут повышать производительность, как никакие другие системы.

В данной статье были представлены некоторые методы и концепции повышения производительности в офисе с использованием инструментов командной строки и приложений системы UNIX. Вы сможете применить эти идеи в ваших собственном офисе и при небольшой изобретательности разработать новые способы для экономии времени и повышения производительности.

Ресурсы

Научиться

  • Оригинал статьи (EN)
  • Expect exceeds expectations (developerWorks, апрель 2002): чтобы получить детальное введение в язык Expect, прочитайте статью Камерона Лэирда.(EN)
  • Hone your regexp pattern-building skills (developerWorks, июль 2006): в этой статье приводятся примеры мощных, настоящих регулярных выражений, которые могут повысить производительность вашей работы.
  • Tcl your desktop (developerWorks, июнь 2006): сделайте ваш рабочий стол упорядоченным и эффективным, проделывая путь, обозначенный в этой статье.(EN)
  • Text processing with UNIX (developerWorks, август 2006): в этой статье показана мощь инструментов командной строки UNIX для обработки текста.
  • Working smarter, not harder (developerWorks, август 2006): часть 2 серии "Speaking UNIX" содержит азбуку встроенного инструмента history.(EN)
  • AIX и UNIX: посетите раздел developerWorks, посвященный AIX и UNIX, чтобы развить ваши навыки в области UNIX.
  • AIX и UNIX для новичков: посетите страницу AIX и UNIX для новичков, чтобы узнать больше про AIX и UNIX.
  • developerWorks technical events and webcasts: будьте в курсе последних технических событий и Webcast-конференций сообщества developerWorks.(EN)
  • Podcast-каналы: настройте приемники и поймайте волну технических экспертов IBM.(EN)

Получить продукты и технологии

  • Утилита leave: если в вашу систему UNIX не входит утилита leave, вы можете скачать ее свободно распространяемую копию на netbsd.org.(EN)
  • date tool: реализация GNU Project's инструмента date содержит расширение для вывода количества секунд с начала эпохи UNIX. Скачайте свободно распространяемую копию с GNU Project Web site.(EN)
  • Испытываемое программное обеспечение IBM : создайте новый проект вашей разработки при помощи программного обеспечения, преднозначенного для загрузки непосредственно с developerWorks.(EN)

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=AIX и UNIX
ArticleID=267705
ArticleTitle=Советы по UNIX: Увеличение производительности
publish-date=11082007