В Linux команда nohup
(HangUP) поддерживает работу процессов даже после выхода из оболочки или терминала.
Команда предотвращает получение процессами или заданиями сигнала SIGHUP, который отправляется процессу при закрытии или выходе из терминала.
Содержание
Синтаксис
nohup КОМАНДА [АРГУМЕНТ]
Ввод и вывод
Если стандартный ввод является терминалом, то он берётся из нечитаемого файла.
Если стандартный вывод является терминалом, то вывод добавляется в nohup.out
, при наличии возможности, в противном случае — сюда:
$HOME/nohup.out
Если стандартный поток ошибок является терминалом, то он перенаправляется в стандартный вывод. Запись вывода в ФАЙЛ осуществляется так:
nohup КОМАНДА > ФАЙЛ
Использование команды nohup в Linux
Проверка версии утилиты
Для проверки версии утилиты используется следующий синтаксис:
oleg@mobile:~:$ nohup --v
nohup (GNU coreutils) 9.1
Copyright (C) 2022 Free Software Foundation, Inc.
Лицензия GPLv3+: GNU GPL версии 3 или новее.
Это свободное ПО: вы можете изменять и распространять его.
Нет НИКАКИХ ГАРАНТИЙ в пределах действующего законодательства.
Автор программы — Jim Meyering.
oleg@mobile:~:$
Запуск процесса
Для того чтобы процессы/задания выполнялись в оболочке и не были бы уничтожены при выходе из неё команда выполняется так:
oleg@mobile:~:$ nohup ~/Directory/convert.sh
nohup: ввод игнорируется, вывод добавляется в 'nohup.out'
oleg@mobile:~:$
В скрипт я внёс ошибку. Вывод команды был сохранен в nohup.out
:
oleg@mobile:~:$ cat nohup.out
mkdir: невозможно создать каталог «thumbnails»: Файл существует
convert: unable to open image '*.jpg': Нет такого файла или каталога @ error/blob.c/OpenBlob/3569.
convert: no images defined `thumbnails/*.jpg.png' @ error/convert.c/ConvertImageCommand/3342.
oleg@mobile:~:$
Вывод можно также перенаправить в другой файл:
oleg@mobile:~:$ nohup ~/Directory/convert.sh > output.txt
nohup: ввод игнорируется и поток ошибок перенаправляется на стандартный вывод
oleg@mobile:~:$ cat output.txt
mkdir: невозможно создать каталог «thumbnails»: Файл существует
convert: unable to open image '*.jpg': Нет такого файла или каталога @ error/blob.c/OpenBlob/3569.
convert: no images defined `thumbnails/*.jpg.png' @ error/convert.c/ConvertImageCommand/3342.
oleg@mobile:~:$
Можно перенаправить в файл и стандартную ошибку и вывод с использованием атрибута 2>&1
:
oleg@mobile:~:$ nohup ~/Directory/convert.sh > output.txt 2>&1
oleg@mobile:~:$ cat output.txt
nohup: ввод игнорируется
mkdir: невозможно создать каталог «thumbnails»: Файл существует
convert: unable to open image '*.jpg': Нет такого файла или каталога @ error/blob.c/OpenBlob/3569.
convert: no images defined `thumbnails/*.jpg.png' @ error/convert.c/ConvertImageCommand/3342.
oleg@mobile:~:$
Запуск процесса в фоновом режим
Для запуска процесса в фоновом режиме в конце команды добавляется символ &
. Для примера пингуем linuxcookbook.ru
и отправляем его в фоновый режим:
oleg@mobile:~:$ nohup ping linuxcookbook.ru &
[1] 122843
oleg@mobile:~:$ nohup: ввод игнорируется, вывод добавляется в 'nohup.out'
oleg@mobile:~:$ cat nohup.out
PING linuxcookbook.ru (139.162.132.20) 56(84) bytes of data.
64 bytes from li1398-20.members.linode.com (139.162.132.20): icmp_seq=1 ttl=52 time=43.5 ms
64 bytes from li1398-20.members.linode.com (139.162.132.20): icmp_seq=2 ttl=52 time=41.2 ms
64 bytes from li1398-20.members.linode.com (139.162.132.20): icmp_seq=3 ttl=52 time=37.3 ms
64 bytes from li1398-20.members.linode.com (139.162.132.20): icmp_seq=4 ttl=52 time=40.2 ms
64 bytes from li1398-20.members.linode.com (139.162.132.20): icmp_seq=5 ttl=52 time=36.5 ms
64 bytes from li1398-20.members.linode.com (139.162.132.20): icmp_seq=6 ttl=52 time=39.1 ms
64 bytes from li1398-20.members.linode.com (139.162.132.20): icmp_seq=7 ttl=52 time=39.5 ms
64 bytes from li1398-20.members.linode.com (139.162.132.20): icmp_seq=8 ttl=52 time=38.7 ms
64 bytes from li1398-20.members.linode.com (139.162.132.20): icmp_seq=9 ttl=52 time=41.1 ms
...
oleg@mobile:~:$
Для проверки работы процесса в фоне применяется команда pgrep
с опцией -a
:
oleg@mobile:~:$ pgrep -a ping
122843 ping linuxcookbook.ru
oleg@mobile:~:$
Остановка запущенного процесса
Для остановки запущенного процесса используется команда kill
, за которой следует идентификатор (ID) процесса:
oleg@mobile:~:$ kill 122843
oleg@mobile:~:$
Выводы
Из приведённых примеров использования в Linux команды nphup
следует:
- все процессы, запущенные с помощью этой команды, будут игнорировать сигнал SIGHUP даже после выхода из оболочки;
- как только задание запущено или выполнено, стандартный ввод будет недоступен для пользователя;
- файл
nohup.out
используется по умолчанию дляstdout
иstderr
.