Как я могу выполнить команду, которая переживет терминал близко?

Один из следующих 2 должен работать:

$ nohup redshift &

или

$ redshift &
$ disown

Посмотрите следующее некоторое время больше информации о том, как это работает:

331
07.03.2019, 14:31
11 ответов

Один из следующих 2 должен работать:

$ nohup redshift &

или

$ redshift &
$ disown

Посмотрите следующее некоторое время больше информации о том, как это работает:

332
27.01.2020, 19:26
  • 1
    Второй (redshift & disown) работавший для меня на Ubuntu 10.10. Это, кажется, хорошо работает, помещая все это на одну строку. Есть ли какая-либо причина, что я не должен делать этого? –  Matthew 13.11.2010, 02:52
  • 2
    @Matthew первое должно хорошо работать также, это просто, не делает фона как второе (Вы возможно хотите nohup redshift & таким образом, это делает фон). И помещение второго на одной строке прекрасно, хотя обычно Вы отделяетесь с ; (redshift &; disown) –  Michael Mrozek♦ 13.11.2010, 05:14
  • 3
    @Michael: Оба ; и & разделители команды и имеют одинаковый приоритет. Единственной разницей является синхронное по сравнению с асинхронным выполнением (соответственно). Нет никакой потребности использовать &; в предпочтении только к & (это работает, но это немного избыточно). –  Chris Johnsen 13.11.2010, 06:29
  • 4
    хороший ответ, можно было бы добавить, что это будет хорошая идея перенаправить stdout и stderr так, чтобы терминал не был массово разослан с выводом отладки –  Kim 13.11.2010, 08:22
  • 5
    Кроме того, redshift &! будет сразу отрицать красное смещение. –   21.04.2013, 21:30

Если Ваша программа уже работает, можно приостановить ее с Ctrl-Z, вытяните его в фон с bg и затем disown это, как это:

$ sleep 1000
^Z
[1]+  Stopped                 sleep 1000
$ bg
$ disown
$ exit
146
27.01.2020, 19:26
  • 1
    после отрицает, как я могу снова считать stdout рабочего процесса? –  Necktwi 22.05.2014, 13:59
  • 2
  • 3
    Это не работало на меня по некоторым причинам (песни) –  Ian 17.04.2015, 16:42
  • 4
    @necktwi disown не разъединяет stdout или stderr. Однако nohup делает, как делает >/dev/null (разъедините стандарт), 2>/dev/null (разъедините стандартную погрешность). Это (disown) управление заданиями разъединений. –  ctrl-alt-delor 22.07.2016, 01:08
  • 5
    Кому-либо еще находящему это, это действительно испортило вещи для меня так быть осторожным. Ctrl+z остановил его очень хорошо, но bg заставил его начать работать снова, и теперь это не ответит на Ctrl+Z или Ctrl+C. Теперь, кажется, нет никакого способа выйти из рабочей команды безопасно вообще. Никакая идея, почему, просто сделал точно, что это сказало, но по любой причине bg купленный это назад выполнение. Я не могу сделать следующего шага ввода disown потому что существует слишком много вывода для ввода чего-либо. –  John Mellor 20.09.2017, 18:47

Можно выполнить процесс как это в терминале

setsid process

Это запустит программу на новой сессии. Как объясненный http://hanoo.org/index.php?article=run-program-in-new-session-linux

30
27.01.2020, 19:26
  • 1
    Что Вы рассматриваете как преимущества setsid по nohup? –  itsbruce 30.10.2012, 12:52
  • 2
    1), Это не печатает раздражающее сообщение о nohup.out. 2) Это не остается в списке задания Вашей оболочки, таким образом, это не создает помехи выводу jobs. –  Mikel 07.11.2012, 00:24

Хороший ответ уже отправляется @StevenD, все же я думаю, что это могло бы разъяснить его немного больше.

Причина, что процесс уничтожается после завершения терминала, состоит в том, что процесс Вы запуск является дочерним процессом терминала. После того как Вы закрываете терминал, это уничтожит эти дочерние процессы также. Вы видите дерево процесса с pstree, например, при выполнении kate & в Konsole:

init-+
     ├─konsole─┬─bash─┬─kate───2*[{kate}]
     │         │      └─pstree
     │         └─2*[{konsole}]

Сделать kate процесс, отсоединенный от konsole когда Вы завершаете konsole, использовать nohup с командой, как это:

nohup kate &

После закрытия konsole, pstree будет похож на это:

init-+
     |-kate---2*[{kate}]

и kate выживет.:)

Альтернатива использует screen/tmux/byobu, который будет поддерживать в рабочем состоянии оболочку, независимую от терминала.

50
27.01.2020, 19:26
  • 1
    , у меня были проблемы с отрицать методами. Это в настоящее время работает на меня, таким образом, upvoting. Мне также нравится это, потому что я могу выследить-f nohup.out для наблюдения то, что происходит, но не беспокойство о моей сессии провальный –  Ian 17.04.2015, 16:44

У меня есть сценарий к:

  • Выполните произвольные команды в фоновом режиме

  • Мешайте им быть уничтоженными с окном терминала

  • Подавите их вывод

  • Статус выхода дескрипторов

Я использую его главным образом для gedit, evince, inkscape и т.д. это все имеет большой раздражающий терминальный вывод. Если команда заканчивается прежде TIMEOUT, статус выхода nohup возвращается вместо нуля.

#!/bin/bash

TIMEOUT=0.1

#use nohup to run the command, suppressing its output and allowing the terminal to be closed
#also send nohup's output to /dev/null, supressing nohup.out
#run nohup in the background so this script doesn't block
nohup "${@}" >/dev/null 2>&1 &
NOHUP_PID=$!

#kill this script after a short time, exiting with success status - command is still running
#this is needed as there is no timeout argument for `wait` below
MY_PID=$$
trap "exit 0" SIGINT SIGTERM
sleep $TIMEOUT && kill $MY_PID 2>/dev/null & #ignore "No such process" error if this exits normally

#if the command finishes before the above timeout, everything may be just fine or there could have been an error
wait $NOHUP_PID
NOHUP_STATUS=$?
#print an error if there was any. most commonly, there was a typo in the command
[ $NOHUP_STATUS != 0 ] && echo "Error ${@}"
#return the exit status of nohup, whatever it was
exit $NOHUP_STATUS

примеры...

>>> run true && echo success || echo fail
success
>>> run false && echo success || echo fail
Error false
fail
>>> run sleep 1000 && echo success || echo fail
success
>>> run notfound && echo success || echo fail
Error notfound
fail
7
27.01.2020, 19:26

Хотя все предложения работают хорошо, я нашел свою альтернативу использовать Экран , программа, которая устанавливает виртуальный терминал на вашем экране.

Вы можете рассмотреть возможность начать его с экрана Session_Name . Экран может быть установлен практически на всех производных Linux и Unix. Удар Ctrl + A и (нижний регистр) C начнется вторая сессия. Это позволит вам переключаться взад-вперед между начальным сеансом, ударив Ctrl + A и 0 или более новая сессия, ударяя Ctrl ] + А и 1 . Вы можете иметь до десяти сессий в одном терминале. Раньше я начинал сеанс на работе, пойти домой, SSH в мою рабочую машину, а затем вызвать Security_rame Session_Name . Это воссоединит вас к этому удаленному сеансу.

9
27.01.2020, 19:26

Вы можете настроить процесс (PID) так, чтобы он не получал сигнал HUP при выходе из системы и закрытии сеанса терминала. Используйте следующую команду:

nohup -p PID
4
27.01.2020, 19:26

Возможно, аналогично ответу, предложенному apolinsky, я использую вариант на screen. Ванильная команда выглядит так

screen bash -c 'long_running_command_here; echo; read -p "ALL DONE:"'

Сессия может быть отключена с помощью Ctrl ACtrl D и снова подключена в простом случае с помощью screen -r. У меня это завернуто в сценарий под названием session, который живет в моем PATH, готовый для удобного доступа:

#!/bin/bash
#
if screen -ls | awk '$1 ~ /^[1-9][0-9]*\.'"$1"'/' >/dev/null
then
    echo "WARNING: session is already running (reattach with 'screen -r $1')" >&2
else
    exec screen -S "$1" bash -c "$@; echo; echo '--------------------'; read -p 'ALL DONE (Enter to exit):'"
    echo "ERROR: 'screen' is not installed on this system" >&2
fi
exit 1

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

3
27.01.2020, 19:26

Я предпочитаю:

(applicationName &)

например: {{1 }} linux @ linux-desktop: ~ $ (chromium-browser &)

Обязательно используйте круглые скобки при вводе команды!

7
27.01.2020, 19:26

Как и в других ответах, опубликованных ранее,можно перевести запущенный процесс в использование screenзадним числом благодаря reptyr , а затем закрыть терминал. Шаги описаны в этом посте . Шаги, которые нужно предпринять:

  1. Приостановить процесс
  2. Возобновление процесса в фоновом режиме с помощьюbg
  3. disownпроцесс
  4. Запустить screenсеанс
  5. Найти PID процесса
  6. Используйте reptyr, чтобы взять на себя управление процессом
3
27.01.2020, 19:26

Теги

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