Отвязать процесс от консоли 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 или нет, но вы не можете использовать свою оболочку, чтобы заставить его сделать это.

Читайте также:  Boot linux with windows boot manager

Для управления выводом фонового процесса у вас есть множество опций из сценариев, вероятно, первым приходит на ум «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 — лишний! ( попробуйте без него 😉 )

Читайте также:  System clear no linux

Во-вторых, попробуйте ещё
$ 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 связан с терминалом, могут возникнуть две проблемы:

  1. Ваш управляющий терминал заполнен огромным количеством выходных данных и сообщений об ошибках/диагностике.
  2. В случае закрытия терминала процесс вместе с его дочерними процессами будет завершен.

Чтобы решить эти две проблемы, вам нужно полностью отсоединить процесс от управляющего терминала. Прежде чем мы перейдем к решению проблемы, давайте кратко расскажем, как запускать процессы в фоновом режиме в 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

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

Важно отметить, что с любыми вопросами или замечаниями по этому вопросу обращайтесь к нам, используя форму для комментариев ниже.

Источник

Оцените статью
Adblock
detector