Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Администрирование систем Linux. Фоновые задачи

Оригинал: Background jobs
Автор: Paul Cobbaut
Дата публикации: 12 марта 2015 г.
Перевод: A. Панин
Дата перевода: 28 марта 2015 г.

Глава 3. Фоновые задачи

3.1. Фоновые процессы

3.1.1. Команда jobs

Список задач, запущенных с помощью вашей текущей командной оболочки и выполняющихся в фоновом режиме, может быть выведен с помощью команды jobs. По умолчанию у вас не должно быть каких-либо задач, выполняющихся в фоновом режиме.

root@rhel53 ~# jobs
root@rhel53 ~#

Данная команда jobs будет использоваться несколько раз на протяжении данной главы.

3.1.2. Сочетание клавиш Control-Z

Исполнение некоторых процессов может быть остановлено с помощью комбинации клавиш Ctrl-Z. Данная комбинация клавиш позволяет отправить сигнал SIGSTOP ядру Linux, что приведет к остановке исполнения процесса.

В том случае, если данная комбинация клавиш используется при работе с текстовым редактором vi(m), процесс текстового редактора vi(m) продолжает исполняться в фоновом режиме. Процесс vi(m), исполняющийся в фоновом режиме, может быть обнаружен в выводе команды jobs.

[paul@RHEL4a ~]$ vi procdemo.txt
[5]+ Stopped                 vim procdemo.txt
[paul@RHEL4a ~]$ jobs
[5]+ Stopped                 vim procdemo.txt

3.1.3. Амперсанд (&)

Процессы, которые запускаются в фоновом режиме благодаря символу &, размещенному в конце строки команды, также отображаются в выводе команды jobs.

[paul@RHEL4a ~]$ find / > allfiles.txt 2> /dev/null &
[6] 5230
[paul@RHEL4a ~]$ jobs
[5]+ Stopped               vim procdemo.txt
[6]- Running               find / >allfiles.txt 2>/dev/null &
[paul@RHEL4a ~]$

3.1.4. Команда jobs -p

Команда jobs поддерживает интересный параметр -p, предназначенный для вывода идентификаторов процессов, исполняющихся в фоновом режиме.

[paul@RHEL4b ~]$ sleep 500 &
[1] 4902
[paul@RHEL4b ~]$ sleep 400 &
[2] 4903
[paul@RHEL4b ~]$ jobs -p
4902
4903
[paul@RHEL4b ~]$ ps `jobs -p`
  PID TTY      STAT   TIME COMMAND
 4902 pts/0    S      0:00 sleep 500
 4903 pts/0    S      0:00 sleep 400
[paul@RHEL4b ~]$

3.1.5. Команда fg

Вызов команды fg позволяет перевести процесс из фонового режима в текущую командную оболочку. Номер фоновой задачи для переноса в текущую командную оболочку является параметром команды fg.

[paul@RHEL5 ~]$ jobs

[1]  Running                 sleep 1000 &
[2]- Running                 sleep 1000 &
[3]+ Running                 sleep 2000 &
[paul@RHEL5 ~]$ fg 3
sleep 2000

3.1.6. Команда bg

Задачи из фонового режима, исполнение которых было приостановлено, могут быть снова запущены в фоновом режиме с помощью команды bg. Команда bg осуществляет отправку сигнала SIGCONT соответствующему процессу.

Ниже приведен пример запуска процесса sleep в фоновом режиме (исполнение которого было остановлено с помощью сочетания клавиш Ctrl-Z) с последующей повторной активацией этого процесса в фоновом режиме с помощью команды bg.

[paul@RHEL5 ~]$ jobs
[paul@RHEL5 ~]$ sleep 5000 &
[1] 6702
[paul@RHEL5 ~]$ sleep 3000

[2]+  Stopped                  sleep 3000
[paul@RHEL5 ~]$ jobs
[1]-  Running                  sleep 5000 &
[2]+  Stopped                  sleep 3000
[paul@RHEL5 ~]$ bg 2
[2]+ sleep 3000 &
[paul@RHEL5 ~]$ jobs
[1]-  Running                  sleep 5000 &
[2]+  Running                  sleep 3000 &
[paul@RHEL5 ~]$ 

3.2. Практическое задание: фоновые процессы

1. Используйте команду jobs, чтобы удостовериться в том, что никакие процессы не выполняются в фоновом режиме.

2. Используйте текстовый редактор vi для создания небольшого текстового файла. Переведите процесс vi в фоновый режим и остановите его исполнение.

3. Используйте команду jobs, чтобы убедиться в том, что исполнение процесса vi в фоновом режиме остановлено.

4. Выполните команду find / > allfiles.txt 2>/dev/null в фоновом режиме. Остановите исполнение этой команды в фоновом режиме перед тем, как будет закончен обход файловой системы.

5. Запустите два процесса sleep с длительным периодом ожидания в фоновом режиме.

6. Выведите информацию обо всех задачах, исполняющихся в фоновом режиме.

7. Используйте утилиту kill для остановки исполнения одного из процессов с именем sleep.

8. Инициируйте продолжение исполнения процесса find в фоновом режиме (убедитесь в том, что исполнение продолжилось).

9. Переведите один из процессов с именем sleep назад в текущую командную оболочку.

10. (Общий вопрос, ответ может быть дан при наличии свободного времени...) Дайте детальные пояснения по поводу источников чисел из следующего примера. В каких условиях переменные заменяются на их значения? Какая командная оболочка осуществляет эту замену?

[paul@RHEL4b ~]$ echo $$ $PPID
4224 4223
[paul@RHEL4b ~]$ bash -c "echo $$ $PPID"
4224 4223
[paul@RHEL4b ~]$ bash -c 'echo $$ $PPID'
5059 4224
[paul@RHEL4b ~]$ bash -c `echo $$ $PPID`
4223: 4224: команда не найдена...

3.3. Корректная процедура выполнения практического задания: фоновые процессы

1. Используйте команду jobs, чтобы удостовериться в том, что никакие процессы не выполняются в фоновом режиме.

jobs (возможно одни из процессов cat все еще исполняется?)

2. Используйте текстовый редактор vi для создания небольшого текстового файла. Переведите процесс vi в фоновый режим и остановите его исполнение.

vi text.txt

(в процессе работы с vi нажмите ctrl-z)

3. Используйте команду jobs, чтобы убедиться в том, что исполнение процесса vi в фоновом режиме остановлено.

[paul@rhel53 ~]$ jobs
[1]+  Stopped                 vim text.txt

4. Выполните команду find / > allfiles.txt 2>/dev/null в фоновом режиме. Остановите исполнение этой команды в фоновом режиме перед тем, как будет закончен обход файловой системы.

[paul@rhel53 ~]$ find / > allfiles.txt 2>/dev/null

(нажмите ctrl-z)

[2]+  Stopped                 find / > allfiles.txt 2> /dev/null

5. Запустите два процесса sleep с длительным периодом ожидания в фоновом режиме.

sleep 4000 & ; sleep 5000 &

6. Выведите информацию обо всех задачах, исполняющихся в фоновом режиме.

[paul@rhel53 ~]$ jobs
[1]-  Stopped                 vim text.txt
[2]+  Stopped                 find / > allfiles.txt 2> /dev/null
[3]   Running                 sleep 4000 &
[4]   Running                 sleep 5000 &

7. Используйте утилиту kill для остановки исполнения одного из процессов с именем sleep.

[paul@rhel53 ~]$ kill -SIGSTOP 4519
[paul@rhel53 ~]$ jobs
[1]   Stopped                 vim text.txt
[2]-  Stopped                 find / > allfiles.txt 2> /dev/null
[3]   Running                 sleep 4000 &
[4]+  Stopped                 sleep 5000

8. Инициируйте продолжение исполнения процесса find в фоновом режиме (убедитесь в том, что исполнение продолжилось).

bg 2 (проверьте состояние задачи с указанным идентификатором в списке фоновых задач)

9. Переведите один из процессов с именем sleep назад в текущую командную оболочку.

fg 3 (и снова проверьте состояние задачи с указанным идентификатором в списке фоновых задач)

10. (Общий вопрос, ответ может быть дан при наличии свободного времени...) Дайте детальные пояснения по поводу источников чисел из следующего примера. В каких условиях переменные заменяются на их значения? Какая командная оболочка осуществляет эту замену?

[paul@RHEL4b ~]$ echo $$ $PPID
4224 4223
[paul@RHEL4b ~]$ bash -c "echo $$ $PPID"
4224 4223
[paul@RHEL4b ~]$ bash -c 'echo $$ $PPID'
5059 4224
[paul@RHEL4b ~]$ bash -c `echo $$ $PPID`
4223: 4224: команда не найдена...

Текущая командная оболочка bash будет заменять имена переменных $$ и $PPID при разборе строки команды перед исполнением команды echo.

[paul@RHEL4b ~]$ echo $$ $PPID
4224 4223

Теперь имена переменных экранированы с помощью двойных кавычек, но текущая командная оболочка bash все также будет заменять имена переменных $$ и $PPID при разборе строки команды перед исполнением команды bash -c.

[paul@RHEL4b ~]$ bash -c "echo $$ $PPID"
4224 4223

А теперь имена переменных экранированы с помощью одинарных кавычек. Текущая командная оболочка bash не будет заменять имена переменных $$ и $PPID. Команда bash -c будет выполнена перед заменой имен переменных на их значения. Вторая же командная оболочка bash будет осуществлять замену имен переменных $$ и $PPID на их значения.

[paul@RHEL4b ~]$ bash -c 'echo $$ $PPID'
5059 4224

При использовании обратных кавычек командная оболочка все также будет осуществлять замену имен переменных на их значения перед исполнением встроенной команды echo. Результатом исполнения этой команды echo будут являться идентификаторы двух процессов. Эти идентификаторы будут переданы команде bash -c. Но эти два числа не являются корректными командами!

[paul@RHEL4b ~]$ bash -c `echo $$ $PPID`
4223: 4224: команда не найдена...

Предыдущий раздел: Оглавление Следующий раздел:
Глава 2. Приоритеты процессов   Глава 4. Дисковые устройства