Команда nohup в Linux

Опубликовано admin - чт, 03/30/2023 - 10:42

В Linux команда nohup (HangUP) поддерживает работу процессов даже после выхода из оболочки или терминала.

Примеры использования команды nohup в Linux

Команда предотвращает получение процессами или заданиями сигнала 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.

Поделиться с друзьями