Иногда вы запускаете программу из терминала, скажем, lxpanel
† . Терминал не вернет вас обратно к приглашению, он зависнет. Вы можете нажать Ctrl+, Cчтобы вернуться к подсказке, но это убьет lxpanel
. Однако нажатие Alt+ F2(которое открывает окно для принятия команды) и запуск lxpanel
работает изящно.
Почему это? Чем отличается запуск команды от терминала и от окна «Выполнить», которое появляется при нажатии Alt+ F2?
† lxpanel здесь только что использовался в качестве примера. Я испытал это с несколькими программами
shell
command-line
jobs
sqram
источник
источник
screen
) может, среди прочего, использоваться для «обертывания» более длительных процессов. Вы можете отсоединиться от него, вернуться к оболочке, затем снова присоединить и увидеть результаты работы запущенного процесса. Присоединение может быть даже сделано из другого терминала, SSH и т. Д. Также могут быть другие программы, которые позволяют вам делать такие вещи.Ответы:
По умолчанию терминал будет запускать программу на переднем плане, поэтому вы не попадете обратно в оболочку, пока программа не завершит работу. Это полезно для программ, которые читают из stdin и / или пишут в stdout - вы обычно не хотите, чтобы многие из них запускались одновременно. Если вы хотите, чтобы программа работала в фоновом режиме, вы можете запустить ее так:
Или, если он уже запущен, вы можете приостановить его с помощью Ctrl+, Zа затем запустить,
bg
чтобы переместить его в фоновый режим. В любом случае вы получите новое приглашение оболочки, но программа все еще работает, и ее вывод появится в терминале (поэтому он может внезапно появиться, пока вы набираете текст)Некоторые программы (как правило, демоны) при запуске запускают отдельный процесс, а затем сразу же завершают основной процесс. Это позволяет программе продолжать работу без блокировки вашей оболочки
источник
Когда вы запускаете программу в терминале, терминал будет «зависать», пока ваша программа не остановится. Нажав Ctrl+, cвы закрываете свою программу и, таким образом, возвращаетесь к подсказке. Вы увидите это со всеми приложениями с графическим интерфейсом, попробуйте, например, Firefox.
Когда вы используете какой-либо другой метод, такой как Alt + F2 или щелкаете по меню, ваша программа запускается в фоновом режиме, поэтому ничего странного не происходит (и в любом случае нет командной строки).
Если вы все еще хотите запускать приложения с графическим интерфейсом из терминала, добавьте
&
в конце вашей команды, например, такЭто говорит терминалу работать
lxpanel
в фоновом режиме и сразу же дает вам другое приглашение.источник
Программы запускаются через оболочку по умолчанию на переднем плане этой оболочки. Это приводит к тому, что оболочка приостанавливает работу и направляет stdin / stdout / sterr из терминала в программу. Программы, запускаемые через среду рабочего стола, разветвляются , что заставляет их работать независимо от программы, которая их запускала. В большинстве оболочек это можно смоделировать, добавив a
&
к команде, хотя это все равно будет подключать std * к терминалу (хотя чтение из stdin в фоновой программе имеет дополнительные сложности).источник
И фоны хорошо, за исключением программ, которые возвращаются позже и требуют взаимодействия с консолью (например, «apt -y update &», которое в конечном итоге переходит в состояние STOP, так как оно хочет предложить пользователю вопрос «действительно действительно принудительно?» Гораздо позже). .... когда никто больше не смотрит).
Чтобы закрыть эту дыру и сообщить процессу, что терминал действительно никогда не станет доступным для него, я добавляю <& - к некоторым из моих команд, полностью отсоединяя их от активного терминала, говоря, что STDIN больше не возможен. Убедитесь, что / bin / bash - это ваша оболочка, если вы ее используете. Скрипт будет регистрировать любые ошибки, связанные с отсутствием псевдотерминала, на который можно было бы разослать любое приглашение.
Например:
мой окончательный способ отделиться от текущей терминальной сессии. И STDOUT, и STDERR регистрируются в runme.log, не имеет значения, завершится ли раньше ваша консоль или оболочка или если вы выйдете / su на другую учетную запись (без мусора терминала из runme), и благодаря тому, что откроет даже родитель-потомок PID отношения удалены.
ОБНОВЛЕНИЕ: даже с этим у меня были проблемы с семафором, связывающим его с именем исходного родителя, поэтому теперь я рекомендую вместо этого:
Конечно, удалите &>, если вы хотите получать выходные данные из CRON по электронной почте, или перенаправьте все это в / dev / null вместо файла.
источник
at now <<< "(cmd1; cmd2; etc.) &> logfile.log"