Я использую Tilda (раскрывающийся терминал) в Ubuntu в качестве своего «централизованного командования» - почти так же, как другие могут использовать GNOME Do, Quicksilver или Launchy.
Тем не менее, я борюсь с тем, как полностью отсоединить процесс (например, Firefox) от терминала, с которого он был запущен - то есть предотвратить такой (не) дочерний процесс
- завершается при закрытии исходящего терминала
- «загрязняет» исходящий терминал через STDOUT / STDERR
Например, чтобы запустить Vim в «правильном» окне терминала, я попробовал простой скрипт, подобный следующему:
exec gnome-terminal -e "vim $@" &> /dev/null &
Однако, это все еще вызывает загрязнение (также, передача имени файла, кажется, не работает).
Ответы:
Прежде всего; как только вы запустили процесс, вы можете запустить его в фоновом режиме, сначала остановив (hit 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 &
), на самом деле вы ничего не можете сделать.Я рекомендую вам получить GNU
screen
. С помощью screen вы можете просто закрыть работающую оболочку, когда вывод процесса становится ненужным, и открыть новую (^Ac
).Да, и, кстати, не используйте "
$@
" там, где вы его используете.$@
означает, что$1
,$2
,$3
..., которая превратит вашу команду на:Это, вероятно, не то, что вы хотите, потому что -e принимает только один аргумент. Используйте,
$1
чтобы показать, что ваш скрипт может обрабатывать только один аргумент.Действительно трудно получить несколько аргументов, работающих должным образом в сценарии, который вы дали (с помощью
gnome-terminal -e
), потому что-e
принимает только один аргумент, который является командной строкой оболочки. Вы должны были бы закодировать свои аргументы в один. Лучший и самый надежный, но довольно грубый способ выглядит так:источник
disown
, затем процесс будет продолжать жить после того, как вы закроете оболочку, так как bash больше не будет HUP.$*
вместо того, чтобы$@
решить проблему отдельных строк уже?reptyr
для этого.nohup
полностью отключает процесс (демонизирует его)источник
nohup
просто игнорируетSIGHUP
сигнал. Он выполняет процесс нормально. Нет демонизации.init
), если оболочка выйдет ... правильно?Если вы используете
bash
, попробуйте ; см Баш (1) .disown [jobspec]
Вы можете попробовать еще один подход
at now
. Если вы не являетесь суперпользователем, ваше разрешение на использованиеat
может быть ограничено.источник
at
делегировать исполнение кому-то еще, мне это нравится! +1zsh
.disown
кажется , что не имеет желаемого эффектаgnome-terminal
-disown
процессы все еще убиваются при выходе из терминала. Я хотел бы знать, почему / как.Читая эти ответы, у меня сложилось первоначальное впечатление, что выдачи
nohup <command> &
будет достаточно. Запустив zsh в gnome-terminal, я обнаружил, чтоnohup <command> &
это не мешает моей оболочке уничтожать дочерние процессы при выходе. Хотяnohup
это полезно, особенно с неинтерактивными оболочками, это гарантирует только такое поведение, если дочерний процесс не сбрасывает свой обработчик дляSIGHUP
сигнала.В моем случае
nohup
следовало бы предотвратить поступление сигналов зависания в приложение, но дочернее приложение (в данном случае VMWare Player) сбрасывало свойSIGHUP
обработчик. В результате при выходе из эмулятора терминала он все равно может убить ваши подпроцессы. Насколько мне известно, это может быть решено только путем удаления процесса из таблицы заданий оболочки. Еслиnohup
переопределяется встроенной оболочкой, как это иногда бывает, этого может быть достаточно, если это не так ...disown
это встроенная оболочкаbash
,zsh
иksh93
,или же
если вы предпочитаете однострочники. Это имеет обычно желательный эффект удаления подпроцесса из таблицы заданий. Это позволяет вам выйти из эмулятора терминала, вообще не сигнализируя о дочернем процессе. Независимо от того, как
SIGHUP
выглядит обработчик, это не должно убивать ваш дочерний процесс.После отключения процесс остается дочерним по отношению к вашему эмулятору терминала (поиграйте с ним,
pstree
если вы хотите посмотреть это в действии), но после выхода из эмулятора терминала вы должны увидеть, что он подключен к процессу init. Другими словами, все так, как и должно быть, и как вы, вероятно, хотите, чтобы это было.Что делать, если ваша оболочка не поддерживает
disown
? Я бы настоятельно рекомендовал перейти на тот, который делает, но в отсутствие этого варианта у вас есть несколько вариантов.screen
иtmux
может решить эту проблему, но они намного тяжелее, и мне не нравится запускать их для такой простой задачи. Они гораздо больше подходят для ситуаций, в которых вы хотите поддерживать tty, как правило, на удаленной машине.setopt nohup
. Это можно использовать для указания того, чтоSIGHUP
не следует отправлять заданиям в таблице заданий при выходе из оболочки. Вы можете применить это непосредственно перед выходом из оболочки или добавить его в конфигурацию оболочки, как~/.zshrc
если бы вы всегда этого хотели.tcsh
илиcsh
, что несколько беспокоит.exec()
. Это очень плохое решение, но источник должен состоять только из пары десятков строк. Затем вы можете передавать команды в качестве аргументов командной строки в C-программу и, таким образом, избегать записи, специфичной для процесса, в таблице заданий.источник
nohup $COMMAND &
$COMMAND & disown
setsid command
Я использовал номер 2 в течение очень долгого времени, но номер 3 работает так же хорошо. Кроме того,
disown
имеетnohup
флаг-h
, может отменять все процессы с помощью-a
и может отменять все запущенные процессы с-ar
.Молчание осуществляется
$COMMAND &>/dev/null
.Надеюсь это поможет!
источник
Я думаю, что экран может решить вашу проблему
источник
в tcsh (и, возможно, в других оболочках) вы можете использовать скобки, чтобы отсоединить процесс.
Сравните это:
К этому:
Это удаляет Firefox из списка вакансий, но он все еще привязан к терминалу; если вы вошли в этот узел через 'ssh', попытка выхода из системы все равно приведет к зависанию процесса ssh.
источник
Самый простой и единственный правильный ответ для bash:
Вам не нужно отсоединять процесс от терминала, но от оболочки.
источник
Чтобы отключить tty shell, запустите команду через sub-shell, например,
(Команда) &
При выходе использованный терминал закрыт, но процесс все еще жив.
проверить -
Откройте другой терминал
Процесс еще жив.
источник
Фоновое и приоритетное задание - это, наверное, одна из первых вещей, которую должен знать каждый системный администратор Unix.
Вот как это делается с помощью bash:
источник
Вы можете запустить свою команду, используя команду nohup, это отсоединит ваш процесс и перенаправит вывод в заданный файл ... но я не уверен, что это именно то, что вам нужно ..
источник
Попробуй daemon - должен быть доступен у твоего дружелюбного менеджера пакетов и всесторонне позаботиться обо всех способах отсоединения себя от терминала.
источник
Просто добавьте это в ваш bashrc / zshrc:
Затем вы можете запустить отрешенные команды, например:
источник
В моем .bashrc у меня есть эти функции именно для этой цели:
Префикс команды,
dos
чтобы запустить ее отдельно от терминала.Функция написана для работы с
bash
иzsh
.источник
( "$@" & disown) &> /dev/null
. Это также не имеет особого смысла в использовании,1>
и2>
, поскольку вы используетеdisown
, что означает, что вы используете bash, а в bash вы можете легко сделать это&>
для перенаправления как stdout, так и stderrrun_disowned
функциональность в других местах в моих точечных файлах. Вы правы в этом&>
, конечно.Я обнаружил в Mac OS X, что мне нужно использовать nohup и disown, чтобы гарантировать, что дочерний процесс не будет сорван с терминалом.
источник
Я использую следующий скрипт для этого. Он останавливает процесс печати на терминале, отключается
nohup
и завершает работу со статусом возврата, если команда завершается вTIMEOUT
.Пример использования:
источник
sudo apt install ucommon-utils
pdetach command
Там вы идете :)
источник
Многие ответы предлагали использовать nohup . Я бы скорее предложил использовать pm2 . Использование pm2 по сравнению с nohup имеет много преимуществ, таких как поддержание приложения в рабочем состоянии, поддержка файлов журналов для приложения и множество других функций. Для более подробной информации проверьте это .
Для установки pm2 необходимо скачать npm . Для системы на основе Debian
и для Redhat
Или вы можете следовать этим инструкциям . После установки npm используйте его для установки pm2
Как только это будет сделано, вы можете начать свое приложение по
Для мониторинга процесса используйте следующие команды:
Управляйте процессами, используя имя приложения или идентификатор процесса, или управляйте всеми процессами вместе:
Файлы журналов можно найти в
источник
nohup
это простая стандартная команда POSIX, поэтому то же самое замечание: ни в коем случае не рекомендуется. @see unix.com/man-page/posix/1p/nohupЕсли ваша цель состоит в том, чтобы просто запустить приложение командной строки без сохранения окна терминала, то вы можете попробовать запустить приложение после запуска терминала с помощью alt-F2.
источник