- Как запустить уже остановленную программу в фоне не переходя в foreground?
- Как я могу возобновить остановленную работу в Linux?
- Linux запустить остановленный процесс
- 8.4.2. Получить состояние запущенного процесса
- 8.4.3. Завершение активных процессов
- 8.4.4. Запуск остановленного задания
- 8.4.5. Использование команды nohup
Как запустить уже остановленную программу в фоне не переходя в foreground?
Запускаю:
1. ping www.google.com
2. Ctrl+Z останавливаем процесс и выходим из него
Процесс висит как Stopped
3. Прописываю bg для того что бы запустить остановленный процесс в фоне и не переходить в сам процесс.
И на 3 этапе меня перекидывает в сам процесс, где я вижу выполнение команды ping, при этом Ctrl+Z/Ctrl+C могут не сработать и надо нажать 10.
Получается что bg делает то же самое что и fg, но при этом будто зависает и не реагирует на остановку или прерывание
Как правильно запустить уже остановленную команду в фоне?
То что можно сразу запустить команду в фоне с помощью >/dev/null 2>&1 & я знаю, но интересно как это должно работать без него и должно ли.
Версия Linux Ubuntu 20.04.2
Простой 1 комментарий
Можно сделать disown, а потом exit, и процесс продолжит работать. Но недолго. Так как у него stdout стал недоступен, он быстро получит ошибку EPIPE при записи в консоль и умрёт.
Так что для корректной работы надо вывод куда-то перенаправить, что не умрёт при завершении сессии. Например, в /dev/null или в файл:
ping foo.bar > ping.log 2>&1 & disown
Что там происходит сейчас можно увидеть по команде tail -f ping.log
pfg21 Возобновляется пинг и меня перекидывает в процесс. Все то же самое, если я использую bg.
И так же Ctrl+Z/Ctrl+C не срабатывают и приходиться выходить через Ctrl+D
все правильно.
вывод bg работающей программы прикреплен к твоей консоли. отправляя ее в бекграунд ты видишь ее выхлоп.
но управление отключено от bg работающей программой (она ж в бекграунде) т.е. ctrl-c ей не посылается.
pfg21, я так понял kill -18 %pid%, это то же самое что fg %номер задачи?
Для чего же тогда использовать bg для процесса и как его прерывать?
gera7, нет. из bg процесс не выходит. сигналы вообще на такое не смотрят.
для того чтобы убить процесс используй сигнал SIGKILL
исторически бекграунд используется для того чтобы через одну консоль запускать несколько работающих процессов.
во времена создания этих команд подключение к серверу было только одно, физически одно — витая пара от терминала до сервера 🙂
bg fg рассчитаны на работы с консолью, с человеком.
сигнал управления может послать любой процесс на машине (с ограничениями по секурности)
>И на 3 этапе меня перекидывает в сам процесс, где я вижу выполнение команды ping, при этом Ctrl+Z/Ctrl+C могут не сработать
Это вывод процеса, сам процес продолжает работать в фоне и ты можеш запустить другой процес если хочешь.
Что бы не видет вывод ping — самое просто перенаправить вывод куда-нибудь.
Нужно понимать два момента
команды jobs, bg и fg являются внутренними командами шелла, и работают с дочерними процессами именно этого шелла.
Если вы приостановили дочерний процесс (Ctrl-Z) или запустили его сразу в бэкраунда (ping google.com &), то командой fg вы выводите его на передний план. Это все равно что в винде вы взяли и поставили мышкой фокус на окне блокнота, после чего нажимая клавиши вы будете писать в этом блокноте.
А если вы приостановили процесс Ctrl-Z и продолжили его через bg, он будет продолжаться в фоне, а на переднем плане будет ваш шелл — вы можете писать другие команды. Все равно что мышкой в винде вы кликнули в рабочий стол рядом с блокнотом, и поэтому нажимая клавиши вы будете писать не в блокноте а на рабочем столе (стрелки по иконкам бегают, какие-то хоткеи могут работать, Enter запустит текущую иконку)
Для понимания потренируйтесь так:
sleep 100 CTRL-Z jobs bg 1 echo I am still in shell fg 1 CTRL+C
И второй момент — можно запустить программу в фоне, и отсоединить ее от текущего шелла вообще (запустить ее через nohup sleep 100 & и отключитья от сессии, или выполнить
sleep 100 &
jobs
disown
jobs
ps aux | grep sleep
в этом случае bg/fg уже не помогут, так как программа запущенная в фоне уже имеет другого родителя, и не подконтрольна внутренним bg/fg — вернуть ее как дочерний процесс под текущий шелл уже не выйдет.
Поэтому Ctrl+C, Ctrl+Z — это просто сигнал который ты отправляешь в текущий «foreground» процесс, с которым ассоциирован stdin
Как я могу возобновить остановленную работу в Linux?
Команда fg — это то, что вы хотите использовать. Вы также можете указать номер задания, если остановлено несколько заданий.
- jobs — список текущих работ
- fg — возобновить работу, которая следующая в очереди
- fg% [число] — возобновить работу [номер]
- bg — выдвинуть следующее задание в очереди в фоновый режим
- bg% [число] — отодвинуть задание [число] на задний план
- kill% [число] — убить задание с номером [число]
- kill — [сигнал]% [номер] — отправить сигнал [сигнал] на номер задания [номер]
- disown% [число] — отменить процесс (терминал больше не будет владельцем), поэтому команда будет работать даже после закрытия терминала.
Это почти все из них. Обратите внимание на% infront номера задания в командах — это то, что говорит kill, вы говорите о заданиях, а не процессах.
Вы также можете ввести % ; то есть вы нажимаете Ctrl-Z в emacs, затем вы можете набрать %emacs в консоли и вернуть его на передний план.
Просто чтобы добавить к другим ответам, Bash позволяет пропустить fg если вы указали номер работы.
Например, они эквивалентны и возобновляют последнюю работу:
Если вы не запускали его с текущего терминала, используйте ps aux | grep чтобы найти номер процесса (pid), затем возобновите его с:
(Несмотря на название, kill — это просто инструмент для отправки сигнала процессу, позволяющий процессам взаимодействовать друг с другом. «Сигнал уничтожения» — это только один из многих стандартных сигналов.)
Дополнительный совет: оберните первый символ имени процесса с помощью [] чтобы в результатах не отображалась сама команда grep . например, чтобы найти процесс emacs , используйте ps aux | grep [e]macs
Linux запустить остановленный процесс
Команды batch и at позволяют вам определять время запуска команды или последовательности команд. При помощи команды batch система определяет время запуска команды, вы это можете определить с помощью команды at. Обе команды ожидают ввод со стандартного ввода (терминала); список команд, вводимых с терминала, должен завершаться нажатием клавиши ^d (одновременное нажатие клавиши Ctrl и клавиши d).
Команда batch очень полезна, если вы запускаете процесс или программу, которые занимают много системного времени. Команда batch представляет системе задание (содержащее последовательность команд для выполнения). Задание ставится в очередь и запускается как только у системы появляется возможность. Это позволяет системе быстро отвечать на запросы других пользователей. Общий формат команды batch:
batch первая команда . . . последняя команда
Если запускается только одна команда, то ее можно ввести в одной командной строке:
В следующем примере batch используется для выполнения команды grep в согласованное время. Команда grep осуществляет поиск всех файлов в текущем справочнике и перенаправляет вывод в файл dol.file.
$ batch grep dollar * > dol.file job 155223141.b at Sun Dec 11:14:54 1989 $
После того как вы зададите задание batch, система выдаст ответ, в котором даны номер задания, дата и время. Номер задания не то же самое, что номер процесса, который система генерирует, когда вы запускаете команду в фоновом режиме.
Команда at позволяет вам указывать точное время выполнения команд. Общий фомат команды at:
at time первая команда . . . последняя команда
Аргумент time состоит из времени дня и даты, если дата не сегодняшняя.
В следующем примере показано, как использовать команду at для посылки сообщения happy birthday пользователю с регистрационным именем emily:
$ at 8:15am Feb 27 banner happy birthday | mail emily $
Обратите внимание, что команда at подобно команде batch выдает ответ с номером задания, датой и временем.
Если вы не хотите, чтобы команды, находящиеся в данный момент в очереди заданий batch или at были выполнены, то можете удалить их из очереди. Для этого воспользуйтесь опцией -r в команде at, указав ее с номером задания. Общий формат такой команды:
$ at -lCW user mylogin 168302040.a at Sat Nov 25 13:00:00 1989 user mylogin 453400603.a at Fri Feb 24 08:15:00 1989 $
Таким образом команда at выполняет команды в указанное время. Вы можете использовать от одной до 4-х цифр и буквосочетания «am» и «pm», чтобы указать время. Чтобы указать дату, задайте имя месяца и вслед за ним число. Если задание должно быть выполнено сегодня, то дату вводить не надо.
at 08:15am Feb 27 at 5:14pm Sept 24
8.4.2. Получить состояние запущенного процесса
Команда ps дает вам состояние всех процессов, запущенных на данный момент. Например, вы можете использовать команду ps, чтобы просмотреть состояние всех процессов, которые запущены в фоновом режиме, применив символ &.
В следующем подпункте обсуждается вопрос, как применить номер PID (идентификатор процесса), чтобы остановить выполнение команды. PID является уникальным номером, который система UNIX назначает каждому активному процессу.
В следующем примере команда grep запускается в фоновом режиме и затем выдается команда ps. Система сообщает в ответ номер идентификации процесса (PID) и номер терминала (TTY). Она также выдает время выполнения каждого процесса (TIME) и имя команды, которая выполняется (COMMAND):
$ grep word * > temp 28223 $ $ ps PID TTY TIME COMD 28124 tty10 0:00 sh 28223 tty10 0:04 grep 28224 tty10 0:04 ps $
Обратите внимание, что система распечатала номер PID для команды grep так же, как и для всех других запущенных процессов: для самой команды ps и команды sh, которая была запущена во время вашей регистрации.
Вы можете приостановить и вновь запустить программу, если в вашей системе предусмотрена функция управления заданиями. Команда jobs выдает список текущих фоновых процессов, запущенных или приостановленных. Команда jobs дополнительно к PID распечатывает идентификатор задания (JID) и имя задания. Чтобы вновь запустить приостановленное задание, либо возобновить фоновый процесс в оперативном режиме, вам необходимо знать JID. JID распечатывается на экране каждый раз, когда вы вводите команду запуска или останова процесса. Если вы введете:
8.4.3. Завершение активных процессов
Команда kill завершает активные процессы в фоновом режиме и команда stop приостанавливает временно процессы. Общий формат этих команд:
Обратите внимание, что вы не можете завершать фоновые задания нажатием клавиш BREAK или DEL. Следующий пример показывает, как вы можете завершить команду grep, которая выполняется в фоновом режиме.
$ kill 28223 28223 Terminated $
После того как система выдаст ответ на запрос, на экране появится подсказка $, означающая, что процесс завершен. Если система не найдет указанный PID, то появится сообщение об ошибке:
Чтобы приостановить оперативный процесс (если активна функция управления заданиями), введите:
8.4.4. Запуск остановленного задания
Если функция управления заданиями активна, то вы можете вновь запустить приостановленный процесс. Чтобы вновь запустить процесс, остановленный командой stop, вы сначала должны определить JID с помощью команды jobs. Затем вы можете использовать JID со следующими командами: fg — возобновляет приостановленное задание или переводит задание из фонового режима в оперативный; bg — вновь запускает приостановленное задание в фоновом режиме.
8.4.5. Использование команды nohup
Все процессы, за исключением at и batch, завершаются, когда вы выходите из системы. Если вы хотите, чтобы после вашего выхода из системы процесс в фоновом режиме продолжал выполняться, то вам необходимо использовать команду nohup. Команда nohup имеет следующий формат:
Предположим, вы хотите, чтобы команда grep осуществила поиск во всех файлах в вашем текущем справочнике строки «word» и перенаправила вывод в файл word.list, и затем, не ожидая завершения, вы хотите выйти из системы, то введите следующую строку:
nohup grep word * > word.list &
Вы можете завершить команду nohup с помощью команды kill.