Чтение онлайн

ЖАНРЫ

Искусство программирования на языке сценариев командной оболочки

Купер Мендель

Шрифт:

help

help COMMAND -- выводит краткую справку по использованию внутренней команды COMMAND. Аналог команды whatis, только для внутренних команд.

bash$ help exit

exit: exit [n]

Exit the shell with a status of N. If N is omitted, the exit status

is that of the last command executed.

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-22. Ожидание завершения процесса перед тем как продолжить работу

#!/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 также снимает эту проблему.

Поделиться с друзьями: