Некоторые из нижеследующих команд принимают, в качестве аргумента, "идентификатор задания". См. таблицу в конце главы.
- jobs
-
Выводит список заданий, исполняющихся в фоне. Команда ps более информативна.
Задания и процессы легко спутать. Некоторые внутренние команды, такие как kill, disown и wait принимают в качестве параметра либо номер задания, либо номер процесса. Команды fg, bg и jobs принимают только номер задания.
bash$ sleep 100 & [1] 1384 bash $ jobs [1]+ Running sleep 100 &
"1" -- это номер задания (управление заданиями осуществляет текущий командный интерпретатор), а "1384" -- номер процесса (управление процессами осуществляется системой). Завершить задание/процесс ("прихлопнуть") можно либо командой kill %1, либо kill 1384.
Спасибо S.C.
- disown
-
Удаляет задание из таблицы активных заданий командной оболочки.
- fg, bg
-
Команда fg переводит задание из фона на передний план. Команда bg перезапускает приостановленное задание в фоновом режиме. Если эти команды были вызваны без указания номера задания, то они воздействуют на текущее исполняющееся задание.
- wait
-
Останавливает работу сценария до тех пор пока не будут завершены все фоновые задания или пока не будет завершено задание/процесс с указанным номером задания/PID процесса. Возвращает код завершения указанного задания/процесса.
Вы можете использовать команду wait для предотвращения преждевременного завершения сценария до того, как завершит работу фоновое задание.
Пример 11-23. Ожидание завершения процесса перед тем как продолжить работу
#!/bin/bash ROOT_UID=0 # Только пользователь с $UID = 0 имеет привилегии root. E_NOTROOT=65 E_NOPARAMS=66 if [ "$UID" -ne "$ROOT_UID" ] then echo "Для запуска этого сценария вы должны обладать привилегиями root." exit $E_NOTROOT fi if [ -z "$1" ] then echo "Порядок использования: `basename $0` имя-файла" exit $E_NOPARAMS fi echo "Обновляется база данных 'locate'..." echo "Это может занять продолжительное время." updatedb /usr & # Должна запускаться с правами root. wait # В этом месте сценарий приостанавливает свою работу до тех пор, пока не отработает 'updatedb'. # Желательно обновить базу данных перед тем как выполнить поиск файла. locate $1 # В худшем случае, без команды wait, сценарий завершил бы свою работу до того, # как завершила бы работу утилита 'updatedb', # сделав из нее "осиротевший" процесс. exit 0
Команда wait может принимать необязательный параметр -- номер задания/процесса, например, wait %1 или wait $PPID. См. таблицу идентификации заданий.
При запуске команды в фоне из сценария может возникнуть ситуация, когда сценарий приостанавливает свою работу до тех пор, пока не будет нажата клавиша ENTER. Это, кажется, происходит с командами, делающими вывод на stdout. Такое поведение может вызывать раздражение у пользователя.
#!/bin/bash # test.sh ls -l & echo "Done."
bash$ ./test.sh Done. [bozo@localhost test-scripts]$ total 1 -rwxr-xr-x 1 bozo bozo 34 Oct 11 15:09 test.sh _
Разместив команду wait, после запуска фонового задания, можно предотвратить такое поведение сценария.
#!/bin/bash # test.sh ls -l & echo "Done." wait
bash$ ./test.sh Done. [bozo@localhost test-scripts]$ total 1 -rwxr-xr-x 1 bozo bozo 34 Oct 11 15:09 test.sh
Перенаправление вывода в файл или даже на устройство /dev/null также снимает эту проблему.
- suspend
-
Действует аналогично нажатию на комбинацию клавиш Control+-Z, за исключением того, что она приостанавливает работу командной оболочки.
- logout
-
Завершает сеанс работы командной оболочки, можно указать необязательный код завершения.
- times
-
Выдает статистику исполнения команд в единицах системного времени, в следующем виде:
0m0.020s 0m0.020s
Имеет весьма ограниченную сферу применения, так как сценарии крайне редко подвергаются профилированию.
- kill
-
Принудительное завершение процесса путем передачи ему соответствующего сигнала (см. Пример 13-5).
Пример 11-24. Сценарий, завершающий себя сам с помощью команды kill
#!/bin/bash # self-destruct.sh kill $$ # Сценарий завершает себя сам. # Надеюсь вы еще не забыли, что "$$" -- это PID сценария. echo "Эта строка никогда не будет выведена." # Вместо него на stdout будет выведено сообщение "Terminated". exit 0 # Какой код завершения вернет сценарий? # # sh self-destruct.sh # echo $? # 143 # # 143 = 128 + 15 # сигнал TERM
Команда kill -l выведет список всех сигналов. Команда kill -9 -- это "жесткий kill", она используется, как правило, для завершения зависших процессов, которые упорно отказываются "умирать", отвергая простой kill. Иногда достаточно подать команду kill -15. "Процессы-зомби", т.е. процессы, "родители" которых уже завершили работу, не могут быть "убиты" таким способом (невозможно "убить" "мертвого"), рано или поздно с ними "расправится" процесс init.
- command
-
Директива command COMMAND запрещает использование псевдонимов и функций с именем "COMMAND".
Это одна из трех директив командного интерпретатора, которая влияет на обработку команд. Другие две -- builtin и enable.
- builtin
-
Конструкция builtin BUILTIN_COMMAND запускает внутреннюю команду"BUILTIN_COMMAND", на время запрещая использование функций и внешних системных команд с тем же именем.
- enable
-
Либо запрещает, либо разрешает вызов внутренних команд. Например, enable -n kill запрещает использование внутренней команды kill, в результате, когда интерпретатор встретит команду kill, то он вызовет внешнюю команду kill, т.е. /bin/kill.
Команда enable -a выведет список всех внутренних команд, указывая для каждой -- действительно ли она разрешена. Команда enable -f filename загрузит внутренние команды как разделяемую библиотеку (DLL) из указанного объектного файла. [26].
- autoload
-
Перенесена в Bash из ksh. Если функция объявлена как autoload, то она будет загружена из внешнего файла в момент первого вызова. [27] Такой прием помогает экономить системные ресурсы.
Обратите внимание: autoload не является частью ядра Bash. Ее необходимо загрузить с помощью команды enable -f (см. выше).
Таблица 11-1. Идентификация заданий
Нотация | Описание |
---|---|
%N | Номер задания [N] |
%S | Вызов (командная строка) задания, которая начинается со строки S |
%?S | Вызов (командная строка) задания, которая содержит строку S |
%% | "текущее" задание (последнее задание приостановленное на переднем плане или запущенное в фоне) |
%+ | "текущее" задание (последнее задание приостановленное на переднем плане или запущенное в фоне) |
%- | Последнее задание |
$! | Последний фоновый процесс |
Notes
[26] |
Как правило, исходные тексты подобных библиотек, на языке C, располагаются в каталоге /usr/share/doc/bash-?.??/functions. Обратите внимание: ключ -f команды enable может отсутствовать в некоторых системах. |
[27] |
Тот же эффект можно получить с помощью typeset -fu. |