- Как полностью отсоединить процесс от терминала?
- 18 ответов 18
- Как «отвязать» процесс от терминала?
- Re: Как »отвязать» процесс от терминала?
- Re: Как »отвязать» процесс от терминала?
- Re: Как »отвязать» процесс от терминала?
- Re: Как »отвязать» процесс от терминала?
- Re: Как »отвязать» процесс от терминала?
- Re: Как »отвязать» процесс от терминала?
- Re: Как »отвязать» процесс от терминала?
- Re: Как »отвязать» процесс от терминала?
- Re: Как »отвязать» процесс от терминала?
- Re: Как »отвязать» процесс от терминала?
- Запуск команд Linux в фоновом режиме и отсоединение от терминала
- Запуск команды или процесса Linux в фоновом режиме
- Сохраняйте процессы Linux запущенными после закрытия терминала
- Отключить процессы Linux в терминале
Как полностью отсоединить процесс от терминала?
Например, чтобы запустить Vim в «правильном» окне терминала, я попробовал простой скрипт, подобный следующему:
exec gnome-terminal -e "vim $@" &> /dev/null &
Однако, это все еще вызывает загрязнение (также, передача имени файла, кажется, не работает).
18 ответов 18
Прежде всего; как только вы начали процесс, вы можете запустить его в фоновом режиме, сначала остановив (нажав Ctrl — Z ), а затем набрав bg чтобы возобновить его в фоновом режиме. Теперь это «работа», и его stdout / stderr / stdin все еще подключен к вашему терминалу.
Вы можете сразу начать процесс как фоновый, добавив в его конец символ «&»:
Чтобы запустить его в фоновом режиме, используйте это:
Некоторая дополнительная информация:
nohup — это программа, которую вы можете использовать для запуска своего приложения таким образом, чтобы вместо нее stdout/stderr можно было отправлять в файл и чтобы закрытие родительского сценария не SIGHUP дочернего элемента. Тем не менее, вы должны иметь предвидение, чтобы использовать его, прежде чем запустить приложение. Из-за того, как работает nohup , вы не можете просто применить его к работающему процессу.
disown — это встроенная утилита bash, которая удаляет задание оболочки из списка заданий оболочки. Это означает, что вы больше не можете использовать fg , bg , но, что более важно, когда вы закрываете свою оболочку, она больше не будет зависать или отправлять SIGHUP этому дочернему элементу. В отличие от nohup , disown используется после запуска и фонового процесса.
То, что вы не можете сделать, это изменить stdout/stderr/stdin процесса после его запуска. По крайней мере, не из оболочки. Если вы запустите свой процесс и скажете ему, что его стандартный вывод — это ваш терминал (то, что вы делаете по умолчанию), то этот процесс настроен для вывода на ваш терминал. Ваша оболочка не имеет никакого отношения к настройке FD процессов, это просто то, чем управляет сам процесс. Сам процесс может решить, закрыть ли его stdout/stderr/stdin или нет, но вы не можете использовать свою оболочку, чтобы заставить его сделать это.
Для управления выводом фонового процесса у вас есть множество опций из сценариев, вероятно, первым приходит на ум «nohup». Но для интерактивных процессов вы запускаете, но забыли замолчать ( firefox < /dev/null &>/dev/null & ), на самом деле вы ничего не можете сделать.
Я рекомендую вам получить screen GNU. С помощью экрана вы можете просто закрыть работающую оболочку, когда вывод процесса становится надоедливым, и открыть новую ( ^Ac ).
Да, и, кстати, не используйте » $@ » там, где вы его используете.
$@ означает, $1 , $2 , $3 . что превратит вашу команду в:
gnome-terminal -e "vim $1" "$2" "$3" .
Это, вероятно, не то, что вы хотите, потому что -e принимает только один аргумент. Используйте $1 чтобы показать, что ваш скрипт может обрабатывать только один аргумент.
Действительно трудно получить несколько аргументов, работающих должным образом в сценарии, который вы задали (с помощью gnome-terminal -e ), потому что -e принимает только один аргумент, который является командной строкой оболочки. Вы должны будете закодировать свои аргументы в один. Лучший и самый надежный, но довольно грубый способ выглядит так:
gnome-terminal -e "vim $(printf "%q " "$@")"
Как «отвязать» процесс от терминала?
Некоторые программы, например, opera, «захватывают» терминал, в котором запущены.
Пробую это сделать:
# ps -A | grep opera
4107 pts/3 00:01:29 opera
4186 pts/3 00:00:00 opera
# disown 4107
vadim$ disown 4107
bash: disown: 4107: no such job
:-(((
Re: Как »отвязать» процесс от терминала?
запускай $ opera& — и терминал останеться свободным, а если хочешь чтобы и после закрытия терминала приложение оставалось запущенным $ nohup opera&
Re: Как »отвязать» процесс от терминала?
> запускай $ opera& — и терминал останеться свободным, а если хочешь чтобы и после закрытия терминала приложение оставалось запущенным $ nohup opera&
А ещё можно, чтоб «после закрытия терминала приложение оставалось запущенным» просто не «давить сдуру» на кнопку «закрыть», а так «мягонько» попросить
$ exit
Re: Как »отвязать» процесс от терминала?
Дык это я знаю. Мне именно запущенный процес нужно отвязать.
Re: Как »отвязать» процесс от терминала?
> # ps -A | grep opera
> 4107 pts/3 00:01:29 opera
> 4186 pts/3 00:00:00 opera
> # disown 4107
> vadim$ disown 4107
> bash: disown: 4107: no such job
Во-первых, параметр ‘-A’ для ps — лишний! ( попробуйте без него 😉 )
Во-вторых, попробуйте ещё
$ jobs | grep opera
[1]+ Running opera &
$ disown %1
В-третьих, делайте чтоб у вас в консоли указатель был $, а не # — под рутом работать плохо.
Re: Как »отвязать» процесс от терминала?
Проблема в том, что программа ПОЛНОСТЬЮ захватила терминал. Т. е., запустите gimp и попробуйте понабивать команды в его терминале. Не получиться. В этом-то и проблема! 😎 Ключ -А для этого и нужен — чтобы с —другого— терминала видеть процесс с другого.
Re: Как »отвязать» процесс от терминала?
А, вы без «&» запускате — так бы сразу и сказали (а без «&» терминал захватит _любая_ программа на время выполнения).
Тогда конечно, disown не поможет.
Re: Как »отвязать» процесс от терминала?
Не знаю как только «отвязать» процесс от терминала, но как прибить этот самый терминал без убийства запущенного приложения нашёл — например так:
kill -4
Re: Как »отвязать» процесс от терминала?
>что программа ПОЛНОСТЬЮ захватила терминал.
Может помочь: соседнего терминала kill -STOP, потом с этого bg ; disown.
Re: Как »отвязать» процесс от терминала?
Для запуска GUI-приложений воспользуйся grun (gtk2) или xexec (qt)
Настрой свой wm на запуск grun/xexec по hotkey
Re: Как »отвязать» процесс от терминала?
Вообще, всё же хочется заметить, что у вопрошающего в корне неверное представление о процессе:
не программы «захватывают» терминал, а обратно shell ( и терминал тут вообще не причём 😉 ) ждёт окончания завершения программы. Чтоб не ждал как раз и нужен запуск в foreground.
P.S. Не захватить, но зафлудить терминал в самом прямом смысле этого слова можно, командой
$ yes «Linux Rulezz» >
🙂
Запуск команд Linux в фоновом режиме и отсоединение от терминала
В этом руководстве мы представим простую, но важную концепцию обработки процессов в системе Linux, а именно, как полностью отсоединить процесс от управляющего им терминала.
Когда процесс Linux связан с терминалом, могут возникнуть две проблемы:
- Ваш управляющий терминал заполнен огромным количеством выходных данных и сообщений об ошибках/диагностике.
- В случае закрытия терминала процесс вместе с его дочерними процессами будет завершен.
Чтобы решить эти две проблемы, вам нужно полностью отсоединить процесс от управляющего терминала. Прежде чем мы перейдем к решению проблемы, давайте кратко расскажем, как запускать процессы в фоновом режиме в Linux.
Запуск команды или процесса Linux в фоновом режиме
Если процесс уже выполняется, как в приведенном ниже примере команды tar, просто нажмите Ctrl+Z , чтобы остановить его, затем введите команду bg , чтобы продолжить его выполнение в фон как работа.
Вы можете просмотреть все свои фоновые задания, набрав jobs . Однако его stdin, stdout и stderr по-прежнему подключены к терминалу.
$ tar -czf home.tar.gz . $ bg $ jobs
Вы также можете запустить процесс прямо из фона, используя знак амперсанда, & .
$ tar -czf home.tar.gz . & $ jobs
Взгляните на приведенный ниже пример, хотя команда tar была запущена как фоновое задание, на терминал все равно было отправлено сообщение об ошибке, означающее, что процесс все еще подключен к управляющему терминалу.
$ tar -czf home.tar.gz . & $ jobs tar: ./.config/etcher: Cannot open: Permission denied
Сохраняйте процессы Linux запущенными после закрытия терминала
Мы будем использовать команду disown, которая используется после того, как процесс был выполнен и переведен в фоновый режим. Ее работа заключается в удалении задания оболочки из списка активных заданий оболочки, поэтому вы не будете использовать fg , bg для этого конкретного задания.
Кроме того, когда вы закрываете управляющий терминал, задание не зависает и не отправляет SIGHUP каким-либо дочерним заданиям.
Давайте взглянем на приведенный ниже пример использования встроенной функции diswon bash.
$ sudo rsync Templates/* /var/www/html/files/ & $ jobs $ disown -h %1 $ jobs
Вы также можете использовать команду nohup , которая также позволяет процессу продолжать работу в фоновом режиме, когда пользователь выходит из оболочки.
$ nohup tar -czf iso.tar.gz Templates/* & $ jobs
Вам также может понравиться:
- 5 способов сохранить работу удаленных сеансов SSH и процессов после закрытия соединения
- Как ограничить время и использование памяти процессами в Linux
- Как отслеживать запущенные процессы Linux с помощью команды Top
- Все, что вам нужно знать о процессах в Linux [Полное руководство]
Отключить процессы Linux в терминале
Поэтому, чтобы полностью отсоединить процесс от управляющего терминала, используйте приведенный ниже формат команды, он более эффективен для приложений с графическим интерфейсом пользователя (GUI), таких как Firefox:
В Linux /dev/null — это специальный файл устройства, который списывает (избавляется) от всех записанных в него данных, в приведенной выше команде ввод считывается, а вывод отправляется в /dev/null.
Вам также может понравиться:
- Как отключить сеансы терминала Linux с помощью экранной команды
- Как получить список запущенных процессов Linux с их PID
В качестве заключительного замечания, при условии, что процесс подключен к управляющему терминалу, как пользователь, вы увидите несколько выходных строк данных процесса, а также сообщения об ошибках на своем терминале. Опять же, когда вы закроете управляющий терминал, ваш процесс и дочерние процессы будут завершены.
Важно отметить, что с любыми вопросами или замечаниями по этому вопросу обращайтесь к нам, используя форму для комментариев ниже.