Управление заданиями
Для многозадачной системы, каковой и является Linux, функция управления заданиями особенно важна, так как позволяет управлять несколькими программами, выполняемыми одновременно в одной оболочке.
Как правило, введенная команда выполняется в режиме переднего плана. Это означает, что подсказка командной строки возвращается на экран только после того, как завершится выполнение команды. Интерактивные программы, наподобие emacs, захватывают экран или окно, в котором запущена оболочка, и возвращают их командной строке только после завершения работы. Неинтерактивные программы, например find, не захватывают экран; тем не менее, и в этом случае подсказка командной строки возвращается на экран только после завершения программы.
Предположим, вы ввели следующую команду:
$ find / – name '*.tmp' – print > templist
Это команда поиска во всех каталогах системы Linux файлов с расширением .trap и вывода результатов поиска на стандартное устройство вывода. Вывод переадресован в файл templist для последующей обработки. Это означает отсутствие какого-либо вывода на экран. Тем не менее, ввести другую команду до окончания поиска не удастся.
Такая ситуация противоречит идее многозадачности. Необходим способ, с помощью которого можно было бы после ввода команды поиска, не дожидаясь ее завершения, запустить другую программу.
Решить задачу помогает запуск программ в фоновом режиме. Если запускать задания в фоновом режиме, подсказка командной строки будет оставаться на экране, а новые задания можно будет запускать, не дожидаясь завершения уже запущенных.
Простейший способ запуска задания в фоновом режиме – завершение команды запуска знаком амперсанда (&). Этот знак заставляет оболочку запускать команду в фоновом режиме с незамедлительным возвратом подсказки командной строки на экран. Приведенная ранее команда поиска, выполняемая в фоновом режиме, будет иметь вид:
$ find / – name '*.tmp' – print > templist &
Сразу после нажатия Enter на экран возвратится подсказка командной строки. Одновременно начнется выполнение команды поиска.
Чтобы получить список заданий, выполняемых в фоновом режиме, введите команду jobs оболочки 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 поиск временно прекращается. Если теперь ввести команду jobs, результат будет следующим:
[1]+ Stopped find / – name '*.tmp' – print >templist
Обратите внимание: теперь в столбце состояния указано Stopped (остановлено) вместо Running (выполняется). Это задание можно перевести в фоновый режим следующей командой:
$ bg 1
…где единица указывает номер задания. Выполняя одно задание, его номер можно не указывать:
$ bg
После того, как остановленное задание переводится в фоновый режим его выполнение возобновляется, и команда jobs показывает его состояние как Running.