LINUX.ORG.RU

nohup или не nohup - где правда?

 , ,


1

5

Коллега утверждает, что использовать nohup нельзя, потому что это отсекает возможность использовать kill -HUP, но я не видел, чтобы он хоть раз этим пользовался. А я - тем более не пользовался.

Вот и вопрос - как правильно запускать скрипты в качестве демона в фоне? (без всяких systemd unit и rc.init)

★★★★★

Ответ на: комментарий от SevikL

а давай так: скрипты должны быть запущены не только человеком из консоли, но и джобом в дженкинсе, например. или еще каким-то средством автоматизации.

bvn13 ★★★★★ ()

Примерно так выглядит твой вопрос:

Вот и вопрос - как правильно запускать скрипты в качестве демона в фоне? (без всяких systemd unit и rc.init)

Вот и вопрос - как правильно забивать гвозди? (без всяких молотков и гвоздозабивных пистолетов).

mironov_ivan ★★★★★ ()

Коллега утверждает, что использовать nohup нельзя, потому что это отсекает возможность использовать kill -HUP, но я не видел, чтобы он хоть раз этим пользовался.

Кстати, я не уверен, что это в действительности так. Если приложение, запущенное под nohup, установит собственный обработчик SIGHUP, то по kill -HUP он должен срабатывать. А если не установит, то kill -HUP не будет иметь практического смысла.

mironov_ivan ★★★★★ ()
Ответ на: Примерно так выглядит твой вопрос: от mironov_ivan

Вот и вопрос - как правильно запускать скрипты в качестве демона в фоне? (без всяких systemd unit и rc.init)

Вот и вопрос - как правильно забивать гвозди? (без всяких молотков и гвоздозабивных пистолетов)

+1

intelfx ★★★★★ ()
Ответ на: комментарий от bvn13

что это вообще за SIGHUP и зачем он?

Процесс получает этот сигнал когда прекращает свою работу терминал в которым был запущен процесс, процесс должен сам себя корректно завершить, системные процессы (демоны) используют этот сигнал по другому, там обычно им обозначают что нужно перечитать конфиг, т.е. например обновил конфиг nginx и передал sighup одноименному процессу.

Aber ★★ ()
Последнее исправление: Aber (всего исправлений: 1)

использовать nohup нельзя, потому что это отсекает возможность использовать kill -HUP

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

Aber ★★ ()
Последнее исправление: Aber (всего исправлений: 1)

Ты путаешь тёплое с мягким. Демонам не нужен nohup. nohup не делает процесс демоном. Это несвязанные вещи. Почитай Стивенса «Advanced programming in Unix Environment»

cvv ★★★★★ ()
Ответ на: комментарий от bvn13

не только человеком из консоли, но и джобом в дженкинсе

Прям даже и стесняюсь спросить как-то... а чем отличается запуск скрипта человеком от запуска скрипта дженкинсом, пусть даже из пайплайна на слейв?

slamd64 ★★★★ ()
Ответ на: комментарий от bvn13

что это вообще за SIGHUP и зачем он?

Многие «традиционные» демоны используют SIGHUP для переначитки конфигов. Если твой процесс не имеет специальной обработки SIGHUP, то пользуйся и не парься

annulen ★★★★★ ()

нельзя, потому что это отсекает возможность использовать kill -HUP

В треде знатоки, шо пипец.

nohup включает игнорирование сигнала, который по дефолту, если не было такого включения игнорирования — убивает процесс. Если ваш демон умеет сам реагировать на SIGHUP, он поставит обработчик этого сигнала и запуск этого демона с nohup ничего не поменяет, кроме того, что это будет просто избыточно-бесполезно.

vodz ★★★★ ()
Ответ на: комментарий от bvn13

Во-первых, можно же и проверить, во-вторых, судя по всему у вас скрипт, а не демон, и nohup тут еще и подготавливает stdin/stdout для работы с фоном, так что скорее всего лучше с ним.

vodz ★★★★ ()
Ответ на: комментарий от vodz

Если ваш демон умеет сам реагировать на SIGHUP, он поставит обработчик этого сигнала и запуск этого демона с nohup ничего не поменяет, кроме того

…что этот обработчик не получит управление. Запусти

#!/bin/bash

trap "echo 'Bite me!'" HUP

echo $$
while true; do :; done
непосредственно и с nohup, и сравни результаты.

dexpl ★★★★★ ()
Ответ на: комментарий от bvn13

моя твоя не понимать.

ты спросил как запускать если не с nohup. почему не nohup - ты ссылаешься на коллегу, который в отличие от тебя знает, что задающий вопросы всегда выглядит умнее отвечающего и просто заявил, что nohup - не кошер.

тебе дали пачку вариантов, жизнеспособность которых одинакова, а применимость и нужность зависит от задач, но все одинаково подходят и для интерактива и для ci/cd.

и ты такой: ну это имхо извращение. а быть омежкой и слушать ламера-коллегу - не извращение?

SevikL ★★★★ ()
Ответ на: комментарий от dexpl

непосредственно и с nohup, и сравни результаты.

Это особенность sh-ов, hup тут ничем не отличается от других сигналов: если сигнал игнорируется, то trap не устанавливается. Обычные программы-демоны, устанавливают обработчики когда их об этом просят.

vodz ★★★★ ()
Ответ на: комментарий от dexpl

Если ваш демон умеет сам реагировать на SIGHUP, он поставит обработчик этого сигнала и запуск этого демона с nohup ничего не поменяет, кроме того

…что этот обработчик не получит управление. Запусти <код на баше> непосредственно и с nohup, и сравни результаты.

Это особенность обработки сигналов, специфичная для bash (и возможно других совместимых шеллов), смотри в man bash описание trap:

Signals ignored upon entry to the shell cannot be trapped, reset or listed.

Если попробовать написать то же самое на другом ЯП (например на питоне), то результат будет другой:

import os
import signal
import sys


def handler(signum, frame):
    print ('Signal handler called with signal', signum)
    sys.stdout.flush()


# Set the signal handler and a 5-second alarm
signal.signal(signal.SIGHUP, handler)

print('PID:', os.getpid())
sys.stdout.flush()
while True:
    pass

SUGHUP отлично ловится что без nohup, что с ним.

mironov_ivan ★★★★★ ()
Последнее исправление: mironov_ivan (всего исправлений: 1)