Перевод в фоновый режим и уничтожение заданий

Начнём с простого примера. Рассмотрим команду yes, которая на первый взгляд может показаться бесполезной. Эта команда посылает бесконечный поток строк, состоящих из символа y на стандартный вывод. Посмотрим, как работает эта команда:

$ yes

y

y

y

y

y

Последовательность таких строк будет бесконечно продолжаться. Уничтожить этот процесс можно, отправив ему сигнал прерывания, т.е. нажав <Ctrl>+<C>. Поступим теперь иначе. Чтобы на экран не выводилась эта бесконечная последовательность, перенаправим стандартный вывод команды yes на /dev/null. Устройство /dev/null — одно из специальных устройств в системе, оно действует как «чёрная дыра»: все данные, посланные в это устройство, пропадают. С помощью этого устройства очень удобно избавляться от слишком обильного вывода некоторых программ.

$ yes > /dev/null

Теперь на экран ничего не выводится. Однако и приглашение командной оболочки также не возвращается. Это происходит потому, что команда yes все ещё работает и посылает свои сообщения, состоящие из букв y, на /dev/null. Уничтожить это задание также можно, отправив ему сигнал прерывания.

Допустим теперь, что Вы хотите, чтобы команда yes продолжала работать, но при этом и приглашение командной оболочки должно вернуться на экран, так чтобы Вы могли работать с другими программами. Для этого можно команду yes перевести в фоновый режим, и она будет там работать, не общаясь с Вами.

Один способ перевести процесс в фоновый режим — приписать символ
& (амперсанд) к концу команды. Пример:

$ yes > /dev/null &

[1]+ 164

$

Сообщение [1] представляет собой номер задания (англ. job number) для процесса yes. Командная оболочка присваивает номер задания каждому исполняемому заданию. Поскольку yes является единственным исполняемым заданием, ему присваивается номер 1. Число 164 является идентификационным номером, соответствующим данному процессу (PID),
и этот номер также дан процессу системой. Как мы увидим дальше, к процессу можно обращаться, указывая оба этих номера.

Итак, теперь у нас есть процесс команды yes, работающий в фоне, и непрерывно посылающий поток из букв y на устройство /dev/null. Для того, чтобы узнать статус этого процесса, нужно исполнить команду jobs, которая является внутренней командой оболочки.

$ jobs

[1]+ Running yes >/dev/null &

$

Мы видим, что программа yes действительно работает. Для того, чтобы узнать статус задания, можно также воспользоваться командой ps, как это было показано выше.

Для того, чтобы передать процессу сигнал (чаще всего возникает потребность прервать работу задания) используется упомянутая выше утилита kill. В качестве аргумента этой команде даётся либо номер задания, либо PID. Необязательный параметр — номер сигнала, который нужно отправить процессу. По умолчанию отправляется сигнал TERM. В рассмотренном выше случае номер задания был 1, так что команда kill %1 прервёт работу задания. Когда к заданию обращаются по его номеру (а не PID), тогда перед этим номером в командной строке нужно поставить символ % (процент).

Теперь введём команду jobs снова, чтобы проверить результат предыдущего действия:

$ jobs [1]

Terminated yes >/dev/null

Фактически, задание уничтожено, и при вводе команды jobs следующий раз на экране о нем не будет никакой информации.

Уничтожить задание можно также, используя идентификационный номер процесса (PID). Этот номер, наряду с идентификационным номером задания, указывается во время старта задания. В нашем примере значение PID было 164, так что команда kill 164 была бы эквивалентна команде kill %1. При использовании PID в качестве аргумента команды kill вводить символ % (процент) не требуется.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: