Выбрать главу

[1]+ Done find /etc "srm.conf" — print

3.3.2. Получение списка выполняющихся процессов с помощью команды ps

Предположим, имеется сценарий psl, который выполняется довольно долго: $ p$1 &

[2] 28305

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

$ ps
PID TTY TIME CMD
679 pts/0 00:00:01 bash
28305 pts/0 00:02:07 psl
28310 pts/0 00:00:00 ps

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

Если процессов слишком много, воспользуйтесь командой grep, указав в ней номер нужного задания:

$ ps | grep 28305

28305 pts/0 00:02:20 psl

Обратите внимание: команда ps не показывает, в каком режиме выполняется задание — в фоновом или экранном.

3.3.3. Уничтожение фонового задания

Сигнал о завершении посылается процессу командой kilclass="underline"

kill [-сигнал] номер_процесса

Далее в этой книге мы рассмотрим, какие существуют сигналы. Пока же достаточно знать, что по умолчанию команда kill посылает сигнал номер 1 — HUP (hang‑up -oтбой). На экран выводится сообщение о прекращении задания:

$ kill 28305

[1]+ Terminated ./psl

Многие команды и сценарии перехватывают сигнал HUP, поэтому команда kill -1 не уничтожает их. В этом случае нужно воспользоваться командой kill -9, которая посылает процессу сигнал KILL (уничтожить). Этот сигнал не перехватывается и означает безусловное уничтожение процесса.

$ kill -9 28305

[1] + Killed ./psl

3.4. Команда nohup

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

nohup команда &

3.4.1. Запуск задания с помощью команды nohup

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

nohup команда > выходной файл 2>&1 &

'Давайте проверим работу команды nohup на примере упомянутого выше сценария psl.

$ nohup psl &

[1] 179

nohup; appending output to 'nohup.out'

Теперь выйдите из интерпретатора shell, выполнив команду logout, снова зарегистрируйтесь и введите следующую команду:

$ ps x | grep psl

30004 ? RN 4:01 sh ./psl

30006 pts/1 S 0:00 grep psl

Опция x предназначена для вывода списка заданий, не связанных с терминалом (обратите внимание на знак вопроса во втором столбце). В третьем столбце указан статус задания. Статус R означает, что процесс выполняется, статус N — это признак снижения

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

Если система не поддерживает команду ps x, воспользуйтесь опцией -e, которая предназначена для получения списка всех системных процессов:

$ ps -e | grep psl

30004 ? 00:04:01 sh ./psl

3.4.2. Одновременный запуск нескольких заданий

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

cat /home/acccmnts/qtr_04 99 | /apps/bm/trials.awk | sort | lp

Поместим ее в файл:

$ cat > quarterend

cat /home/accounts/qtr_0499 | /apps/bin/trials.awk | sort | lp <CTRL‑D>

Сделаем файл исполняемым:

$ chmod 744 quarterend

Теперь запустим этот файл в фоновом режиме посредством команды nohup, направив результаты работы сценария в файл qtr.out.

$ nohup ./quarterend > qtr.out 2>&l &

[5] 182

Обратите внимание на то, что при вызове файла quarterend указано путевое имя '. /.' Тем самым интерпретатору shell дается указание искать данную команду в текущем каталоге.