Если Вы хотите использовать HTTPS для предотвращения некоторых потенциальных ловушек:
_result=$(wget -qO- https://ipcheckit.com/)
_result="${_result##*Your IP address is<br><b>}"
printf '%s\n' "${_result%%</b></p>*}"
Давайте сначала посмотрим, что происходит, если программа запускается из интерактивной оболочки (подключенной к терминалу) без и
(и без перенаправления). Итак, предположим, что вы только что набрали foo
:
foo
. SIGHUP
, она также отправляет SIGHUP
процессу (что обычно вызывает завершение процесса). Теперь давайте посмотрим, что произойдет, если вы поместите процесс в фоновый режим, то есть наберете foo &
:
foo
. заданиями
и доступен с помощью % n
(где n
- номер задания). fg
, и в этом случае оно будет продолжаться так, как если бы вы не использовали для него и
(и если бы оно было остановлено из-за попытки для чтения со стандартного ввода теперь можно переходить к чтению из терминала). SIGHUP
, она также отправляет процессу SIGHUP
. В зависимости от оболочки и, возможно, от параметров, установленных для оболочки, при завершении оболочки она также отправит процессу сигнал SIGHUP
. Теперь disown
удаляет задание из списка заданий оболочки, поэтому все указанные выше подпункты больше не применяются (включая процесс, которому оболочка отправляет сигнал SIGHUP
). Однако обратите внимание, что он по-прежнему подключен к терминалу, поэтому, если терминал будет уничтожен (что может произойти, если это был pty, например, созданные с помощью xterm
или ssh
, а управляющая программа завершается, закрывая xterm или завершая соединение SSH ), программа завершится ошибкой, как только она попытается прочитать со стандартного ввода или записать на стандартный вывод.
С другой стороны, nohup
эффективно отделяет процесс от терминала:
EOF
). nohup.out
, поэтому программа не сможет выполнить запись в стандартный вывод в случае сбоя терминала, поэтому все, что записывает процесс, не теряется. SIGHUP
(отсюда и имя). Обратите внимание, что nohup
не удаляет процесс из управления заданиями оболочки, а также не помещает его в фоновый режим (но поскольку передний план nohup
работа более или менее бесполезна, вы обычно помещаете ее в фоновый режим, используя &
). Например, в отличие от disown
, оболочка все равно сообщит вам, когда задание nohup завершено (если, конечно, оболочка не будет завершена раньше).
Итак, подведем итог:
&
помещает задание в фоновый режим, то есть блокирует его при попытке чтения ввода и заставляет оболочку не ждать его завершения. disown
удаляет процесс из управления заданиями оболочки, но по-прежнему оставляет его подключенным к терминалу. Одним из результатов является то, что оболочка не отправляет ему SIGHUP
. Очевидно, что его можно применить только к фоновым заданиям, потому что вы не можете ввести его, когда выполняется задание переднего плана. nohup
отключает процесс от терминала, перенаправляет его вывод на nohup.out
и экранирует его от SIGHUP
. Один из эффектов (именованный) заключается в том, что процесс не получит ни одного отправленного SIGHUP
. Он полностью независим от управления заданиями и, в принципе, может использоваться также для заданий переднего плана (хотя это не очень полезно). Используя &
заставляет программу работать в фоновом режиме, таким образом, Вы получите новое приглашение оболочки вместо того, чтобы блокироваться, пока программа не закончится. nohup
и disown
в основном не связаны; они подавляют SIGHUP (зависание) сигналы, таким образом, программа автоматически не закрыта, когда терминал управления закрывается. nohup
делает это, когда задание сначала начинается. Если Вы не делаете nohup
задание, когда это начинается, можно использовать disown
изменить рабочее задание; без аргументов это изменяет текущее задание, которое является тем, которое было просто фоном
nohup
и disown
оба, как могут говорить, подавляют SIGHUP
, но по-разному. nohup
заставляет программу проигнорировать сигнал первоначально (программа может изменить это). nohup
также попытки принять меры, чтобы программа не имела терминал управления, так, чтобы это не было отправлено SIGHUP
ядром, когда терминал закрывается. disown
является чисто внутренним к оболочке; это заставляет оболочку не отправлять SIGHUP
когда это завершается.
– Gilles 'SO- stop being evil'
09.11.2010, 20:26
disown
удаление задания из списка заданий. Если Вы не указываете опцию, она действительно удаляет его из списка заданий. Однако, если Вы указываете -h
опция, каждый jobspec не удален из таблицы. Вместо этого это делает его так, чтобы SIGHUP
не отправляется в задание, если оболочка получает a SIGHUP
.
– tacotuesday
13.11.2013, 08:54
&
не дает Вам терминал, он отсоединяется stdin
от процесса и причин это для выполнения в фоновом режиме, но оба stdout
и stderr
все еще присоединен к текущему tty. Это означает, что можно получить текст из различных программ, перепутанных вместе, который может быть довольно раздражающим, если Вы делаете gimp &
и получите много GTK + ошибки при попытке использовать это tty для чего-то еще.
– Frank
06.06.2014, 00:18
Вот мой опыт попытки запустить soffice в фоновом режиме после не- завершающая команда (например, хвост
). В этом примере я буду использовать sleep 100
.
#!/bin/bash
/opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard &
sleep 100
I см. soffice logs / нажатием Ctrl - C soffice останавливается
#!/bin/bash
nohup /opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard &
sleep 100
Я не вижу soffice журналы / при нажатии Ctrl - C soffice останавливается
#!/bin/bash
/opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard & disown
sleep 100
Я вижу soffice журналы / нажав Ctrl - C soffice останавливается
#!/bin/bash
setsid /opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard &
sleep 100
I см. soffice журналы / нажав Ctrl - C soffice НЕ ОСТАНАВЛИВАЕТСЯ
Для экономии места:
nohup setsid. .
: не показывает журналы / soffice НЕ ОСТАНАВЛИВАЕТСЯ на Ctrl - C
nohup
с и disown
в конце: не показывает логи / soffice останавливается на Ctrl - C