Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции_ОСС.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
476.16 Кб
Скачать

Тема 27. Создание фоновых процессов

При обычном запуске с терминала некоторой программы на исполнение (системной утилиты или прикладной задачи) интерпретатором shell создается привилегированный процесс, который все время связан со своим терминалом. Запуск следующего процесса может быть выполнен пользователем только после завершения текущего, т.е. при появлении приглашения '$' от интерпретатора.

В целях использования возможности параллельного выполнения программ в ОС UNIX отдельные задачи или задания пакетного режима могут быть запущены одновременно с заданиями диалогового режима.Для запуска фонового (параллельного с другими потомками) процесса в командную строку необходимо и достаточно последним символом добавить знак

& (амперсанд):

$ cc prog.c &

2388

$

Shell выводит номер этого процесса (PID) и разрешает ввод

следующей команды.

Фоновые процессы обладают некоторыми недостатками:

- не допускают ввода с клавиатуры;

-обеспечивают вывод на экран, но при этом нарушают целостность вывода диалогового процесса.

Общепринятый прием исключения влияния фонового вывода на интерактивную работу:

ком_строка>имя_файла.out &

  • ком_строка планирует задание для фонового режима

  • перенаправляет вывод вместо экрана в указанный файл головного каталога пользователя.

Пример:

$grep ааа* > grep.out &

194

$ps

PID TTY TIME CMD

194 tty5 0:02 grep

200 tty5 0:01 ps

Особенности работы с фоновым режимом:

  • выполняемая в фоновым режиме программа (команда), требующая стандартного ввода, должна читать его из файла с использованием перенаправленного ввода;

  • программа, выполняемая в фоновом режиме не может быть прервана <Ctrl*C>, т.к. она отсоединяется от клавиатуры и м.б. прекращена только с помощью команды kill или выходом из системы;

  • выход из системы exit надо выполнять два раза: для завершения фонового процесса и завершения основного процесса shell.

В случаях, когда фоновый процесс все же требует ввода данных с клавиатуры, то его надо временно перевести в оперативный режим, ввести данные, и вернуть опять в фоновый с помощью следующих команд:

fg %N - перевод фонового процесса в оперативный;

bg %N - перевод оперативного в фоновый режим.

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

Номер задания “N” выводится:

  • при запуске фоновой программы

  • командой jobs без приостановленя или с приостановлением фонового процесса.

Приостановить выполнение процесса с выходом в shell (например для анализа состояния и результатов работы процедуры) можно с помощью прерывания-

<ctrl*Z>

$

с последующим запуском приостановленного процесса.

Пример.

$inf>f.out& - запуск процедуры inf в фоновом режиме

[1] 1754 - номер задания и идентификатор процесса

$jobs

%1 - номер задания

<ctrl*Z>

[1]+stopped inf>f.out

$bg %1 - запуск на продолжение в фоновом режиме

[1] inf>f.out

Выполнение фоновых заданий прекращается с выходом пользователя из системы. НО! Если фоновая программа должна быть продолжена и после прекращения текущего сеанса работы, то необходимо использовать команду:

$nohup имя_фоновой_программы & команда запускает и защищает фоновую программу от прерываний, вырабатываемых при выходе пользователя из системы, а также 2) перенаправляетфоновый протокол в системный файл nohup.out.

Вместе с тем, вывод протокола работы фоновой программы можно перенаправить в специальный файл, который просмотреть позже без нарушения протокола работы с оперативной задачей:

$nohup имя_фон_программы>имя_файла&

Рассмотрим два случая применения команды nohup.

Первый пример, где nohup перенаправляет протокол в указангный файл :

$nohup cat * > outfile &

[1] 972

$exit - завершается работа оперативного процесса

Повторный вход в систему:

login:

password:

$ps -af|grep cat - конвеер, выделяется строка с шаблоном cat

UID PID PPID CMD

lev 972 1 cat *>outfile &

$

В примере "процесс идет", nohup становится самостоятельным процессом и его PPID меняется - родительским процессом был sh (см. примеры выше), а стал init c PID=1, т.е. приоритет фонового процесса "усиливается" общесистемным процессом init и его выполнение будет продолжаться.

Примечание: в поле CMD может не указываться имя процедуры, а выводиться имя текущей утилиты этой процедуры, дентифицировать процедуру лучше по PID.

Если перенаправление протокола не использовать, то вывод автоматически осуществляется в систеный файл nohup.out, создаваемый системой в головном каталоге пользователя HOME.

Второй пример:

$nohup find / -user lev -type f &

[1] 2301

<сообщение о выводе в nohup.out>

$cd - переход в HOME

$cat nohup.out

<протокол команды find>

$

Команда nohup позволяет таким образом предупредить вывод на экран протокола фонового задания с прерыванием протокола работы оперативного процесса.

Пример: в чем разница в выполнении командных строк?

$PR;pr2;pr3 & - в фоновом режиме выполняется только pr3

$(PR1;pr2;pr3) & - в фоновом режиме выполняются все программы (подстановка опции & перед выполнением каждой программы из списка).