Управление
заданиями
Для многозадачной системы,
каковой и является Linux, функция управления заданиями особенно важна, так как
позволяет управлять несколькими программами, выполняемыми одновременно в одной
оболочке.
Как правило, введенная
команда выполняется в режиме переднего плана. Это означает, что подсказка командной
строки возвращается на экран только после того, как завершится выполнение команды.
Интерактивные программы, наподобие emacs, захватывают экран или окно, в котором
запущена оболочка, и возвращают их командной строке только после завершения
работы. Неинтерактивные программы, например find, не захватывают экран; тем
не менее, и в этом случае подсказка командной строки возвращается на экран только
после завершения программы.
Предположим, вы ввели следующую
команду.
$
find / -name '*.tmp' -print >
templist
Это команда поиска во всех
каталогах системы Linux файлов с расширением . trap и вывода результатов поиска
на стандартное устройство вывода. Вывод переадресован в файл templist для последующей
обработки. Это означает отсутствие какого-либо вывода на экран. Тем не менее,
ввести другую команду до окончания поиска не удастся.
Такая ситуация противоречит
идее многозадачности. Необходим способ, с помощью которого можно было бы после
ввода команды поиска, не дожидаясь ее завершения, запустить другую программу.
Решить задачу помогает
запуск программ в фоновом режиме. Если запускать задания в фоновом режиме, подсказка
командной строки будет оставаться на экране, а новые задания можно будет запускать,
не дожидаясь завершения уже запущенных.
Простейший способ запуска
задания в фоновом режиме - завершение команды запуска знаком амперсанда (&).
Этот знак заставляет оболочку запускать команду в фоновом режиме с незамедлительным
возвратом подсказки командной строки на экран. Приведенная ранее команда поиска,
выполняемая в фоновом режиме, будет иметь вид:
$
find / -name '*.tmp' -print > templist &
Сразу после нажатия Enter
на экран возвратится подсказка командной строки. Одновременно начнется выполнение
команды поиска.
Чтобы получить список заданий,
выполняемых в фоновом режиме, введите команду j obs оболочки bash. Результат
ее выполнения будет примерно следующим.
$
jobs
[1]+ Running find
/ -name ' *.tmp' -print >templist &
Итак, ответ команды показывает,
что в системе выполняется одно задание, что выполняется оно в фоновом режиме
(о чем свидетельствует знак "&"), и что это команда find / -name
' * . tmp' -print >templist &.
Если в фоновом режиме выполняется
несколько заданий, то результат может выглядеть иначе.
[1]- Running find
/ -name '*.tmp' -print >templist &
[2]+ Running ls
-1R / >dirlist &
Если программа запущена
в режиме переднего плана, ее можно перевести в фоновый режим. Комбинация клавиш
Ctrl+Z интерпретируется оболочкой basfi как команда временной остановки текущего
процесса. Например, если команду поиска из предыдущего примера запустить в режиме
переднего плана, то после нажатия Ctrl+Z поиск временно прекращается. Если теперь
ввести команду j obs, результат будет следующим.
[1]+ Stopped find
/ -name '*.tmp' -print >templist
Обратите внимание: теперь
в столбце состояния указано Stopped (остановлено) вместо Running (выполняется).
Это задание можно перевести в фоновый режим следующей командой,
$ bg 1
где единица указывает номер задания. Выполняя одно задание, его номер можно не указывать.
$
bg
После того, как остановленное
задание переводится в фоновый режим его выполнение возобновляется, и команда
j obs показывает его состояние как Running.
Иногда возникает необходимость
приостановить задание без перевода в фоновый режим. К примеру, при работе в
текстовом редакторе emacs (или любом другом) может понадобиться ввести одну
или несколько команд, затем опять вернуться в редактор. Чтобы не выходить полностью
из редактора, приостановите его работу, нажав Ctrl+Z, введите требуемые команды
и вновь вернитесь к работе. Интерактивные программы плохо приспособлены к выполнению
в фоновом режиме, поэтому лучше держать их остановленными до возврата к работе
в режиме переднего плана.
Возврат остановленного
или переведенного в фоновый режим задания в режим переднего плана происходит
по команде fg. Так, остановленный в предыдущем примере редактор emacs возвращается
к работе в режиме переднего плана командой
$
fg
При наличии нескольких
остановленных или выполняемых в фоновом режиме заданий необходимо указать номер
задания, переводимого в режим переднего плана. Если задание emacs имело номер
2, то команда его перевода в режим переднего плана будет следующей.
$
fg 2
Наконец, в некоторых случаях
остановленное или фоновое задание приходится завершать либо уничтожать. Для
уничтожения процесса, указанного его идентификатором (РШ), используется команда
kill. Можно воспользоваться командой ps для определения идентификатора процесса
(см. страницу руководства этой команды) либо уничтожать остановленные или фоновые
задания непосредственно по их номерам.
Например, при наличии в
системе двух фоновых заданий, когда команда j obs выводит на экран:
[1]- Running find
/ -name '*.tmp' -print >templist &
[2]+ Running ls
-1R / >dirlist &
[3]+ Stopped emacs
somefile
уничтожение задания ls
производится командой $ kill %2
Обратите внимание на знак
процента перед номером задания. Без него команда пыталась бы уничтожить процесс
с идентификатором PiD, равным 2. Необходимо различать номер процесса и идентификатор
РШ, поскольку это вещи абсолютно разные.
Рассмотрим следующий пример. Имея один фоновый процесс, вы запускаете второе задание. Система тут же присваивает ему идентификатор PiD, представляющий численное значение, например 100, 999 или 25 678. Малые значения PiD. (особенно, меньше 100) применяются для обозначения всевозможных системных процессов, запускаемых одновременно с загрузкой Linux и выполняемых до выключения компьютера. Следовательно, совпадение идентификатора PiD и номера задания весьма маловероятно.