Как я отсоединяю процесс от Терминала, полностью?

Я использую Tilda (выпадающий терминал) на Ubuntu как моя "команда, центральная" - в значительной степени способ, которым другие могли бы использовать GNOME, Делают, Quicksilver или Launchy.

Однако я борюсь с тем, как полностью отсоединить процесс (например, Firefox) от терминала, он был запущен от - т.е. предотвращает это такой (не-) дочерний процесс

  • завершается при закрытии инициирующего терминала
  • "загрязняет" инициирующий терминал через STDOUT/STDERR

Например, для запуска Vim в "надлежащем" окне терминала, я попробовал простой сценарий как следующее:

exec gnome-terminal -e "vim $@" &> /dev/null &

Однако это все еще вызывает загрязнение (также, передавание имени файла, кажется, не работает).

309
задан 04.08.2011, 12:10

8 ответов

В первую очередь; после того как Вы запустили процесс, Вы можете фон он первой остановкой его (Ctrl-Z хита) и затем ввод bg позволять ему возобновиться в фоновом режиме. Это - теперь "задание" и stdout/stderr/stdin все еще подключены к Вашему терминалу.

Можно запустить процесс как фон сразу путем добавления "и" в конец его:

firefox &

Для выполнения это в фоновом режиме заставило замолчать, используйте это:

firefox </dev/null &>/dev/null &

Некоторая дополнительная информация:

nohup программа, которую можно использовать для запуска приложения с таким образом, что его stdout/stderr может быть отправлен в файл вместо этого и таким образом, что закрытие родительского сценария не будет SIGHUP ребенок. Однако у Вас должно быть предвидение для использования его, прежде чем Вы запустили приложение. Из-за пути nohup работы, Вы не можете только применить его к рабочему процессу.

disown удар, встроенный, который удаляет задание оболочки из списка задания оболочки. То, что это в основном означает, - то, что Вы не можете использовать fg, bg на нем больше, но что еще более важно при закрытии оболочки, она не подвесит или отправит a SIGHUP тому ребенку больше. В отличие от этого, nohup, disown используется после того, как процесс был запущен и фон.

То, что Вы не можете сделать, является изменением stdout/stderr/stdin процесса, запустив его. По крайней мере, не от оболочки. Если Вы запускаете свой процесс и говорите ему, что его stdout является Вашим терминалом (который является тем, что Вы делаете по умолчанию), то тот процесс настроен для вывода к терминалу. Ваша оболочка не имеет никакого бизнеса с установкой FD процессов, это - просто что-то, чем сам процесс управляет. Сам процесс может решить, закрыть ли его stdout/stderr/stdin или нет, но Вы не можете использовать свою оболочку, чтобы вынудить его сделать так.

Для управления выводом фонового процесса у Вас есть много опций из сценариев, "nohup", вероятно, являющийся первым, чтобы прийти на ум. Но для интерактивных процессов Вы запускаете, но забыли заставлять замолчать (firefox < /dev/null &>/dev/null &) Вы не можете сделать многого, действительно.

Я рекомендую получить GNU screen. С экраном можно просто закрыть рабочую оболочку, когда вывод процесса становится беспокойством, и откройте новый (^Ac).


О, и между прочим, не используйте"$@"где Вы используете его.

$@ средства, $1, $2, $3 ..., который повернул бы Вашу команду в:

gnome-terminal -e "vim $1" "$2" "$3" ...

Это, вероятно, не, что Вы хотите, потому что-e только берет один аргумент. Использовать $1 показать, что Ваш сценарий может только обработать один аргумент.

Действительно трудно получить несколько аргументов, работающих правильно в сценарии, который Вы дали (с gnome-terminal -e) потому что -e берет только один аргумент, который является командной строкой оболочки. Необходимо было бы закодировать аргументы в один. Лучшее и самое устойчивое, а скорее cludgy, путь похож так:

gnome-terminal -e "vim $(printf "%q " "$@")"
350
ответ дан 16.12.2019, 22:45

Я нашел на Mac OS X, что должен использовать и nohup И отрицать, чтобы гарантировать, что дочерний процесс не разъединяется с терминалом.

0
ответ дан 16.12.2019, 22:45

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

4
ответ дан 16.12.2019, 22:45

Судите демона - должно быть доступным от Вашего дружественного диспетчера пакетов и всесторонне заботиться о каждом способе разъединить себя с терминалом.

2
ответ дан 16.12.2019, 22:45

в tcsh (и возможно в других оболочках также), можно использовать круглые скобки для отсоединения процесса.

Сравните это:

> jobs # shows nothing
> firefox &
> jobs
[1]  + Running                       firefox

К этому:

> jobs # shows nothing
> (firefox &)
> jobs # still shows nothing
>

Это удаляет Firefox из списка заданий, но он все еще связывается с терминалом; если Вы вошли в систему этого узла через 'ssh', пытаться выйти из системы все еще подвесит процесс ssh.

9
ответ дан 16.12.2019, 22:45

Я думаю, что экран мог бы решить Вашу проблему

9
ответ дан 16.12.2019, 22:45

Если Вы используете bash, попробовать disown [jobspec]; посмотрите удар (1).

Другой подход, который можно попробовать, at now. Если Вы не суперпользователь, Ваше разрешение использовать at может быть ограничен.

60
ответ дан 16.12.2019, 22:45
nohup cmd &

nohup отсоединяет процесс полностью (daemonizes это)

201
ответ дан 16.12.2019, 22:45

Теги

Похожие вопросы