@gera7

Как запустить уже остановленную программу в фоне не переходя в 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
  • Вопрос задан
  • 112 просмотров
Пригласить эксперта
Ответы на вопрос 3
@pfg21
ex-турист
kill -18 %pid%
посылаешь сигнал 18 SIGCONT Continue if stopped
Ответ написан
@xandox
>И на 3 этапе меня перекидывает в сам процесс, где я вижу выполнение команды ping, при этом Ctrl+Z/Ctrl+C могут не сработать

Это вывод процеса, сам процес продолжает работать в фоне и ты можеш запустить другой процес если хочешь.
Что бы не видет вывод ping - самое просто перенаправить вывод куда-нибудь.
Ответ написан
Комментировать
saboteur_kiev
@saboteur_kiev Куратор тега Linux
software engineer
Нужно понимать два момента

команды 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
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы