|
Поиск по сайту:
Главная
О проекте
Web-мастеру
HTML & JavaScript
SSI
Perl
PHP
XML & XSLT
Unix Shell
MySQL
Безопасность
Хостинг
Другое
|
|
11.1. Команды управления заданиями
Некоторые из нижеследующих команд принимают, в качестве
аргумента, "идентификатор
задания". См. таблицу в
конце главы.
- 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) из
указанного объектного файла. .
- autoload
-
Перенесена в Bash из ksh. Если
функция объявлена как autoload, то она будет загружена из
внешнего файла в момент первого вызова. Такой прием помогает
экономить системные ресурсы.
Обратите внимание: autoload не является частью ядра
Bash. Ее необходимо загрузить с помощью команды
enable -f (см.
выше).
Таблица 11-1. Идентификация заданий
Нотация |
Описание |
%N |
Номер задания [N] |
%S |
Вызов (командная строка) задания,
которая начинается со строки S |
%?S |
Вызов (командная строка) задания,
которая содержит строку S |
%% |
"текущее" задание
(последнее задание приостановленное на переднем
плане или запущенное в фоне) |
%+ |
"текущее" задание
(последнее задание приостановленное на переднем
плане или запущенное в фоне) |
%- |
Последнее задание |
$! |
Последний фоновый процесс |
Назад | Вперед
Содержание (общее) | Содержание раздела
Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
|
|
|