Запущение произвольной программы как демон из init сценария

Я знаю, что это не обычный ответ, но я чувствовал, что этот POV должен появиться где-нибудь в ответах. Если Вы решаете использовать только бесплатное программное обеспечение, то в дополнение к ожидаемым преимуществам того, чтобы никогда быть искусственно ограниченным Вашим выбором программного обеспечения, лишенного информации, необходимой, чтобы заставить его работать, или не могущий законно совместно использовать его с другими, которые извлекли бы выгоду из него, Вы получаете удобный побочный эффект никогда необходимости волноваться об аудитах лицензирования программного обеспечения, количествах лицензии или условиях лицензионного соглашения (если Вы не перераспределяете программное обеспечение, в этом случае существуют определенные условия, но они очень легко удовлетворены).

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

10
задан 23 May 2017 в 15:41
3 ответа

Я провел еще несколько исследований и, похоже, ответ - «вы не можете этого сделать». Программа, которая должна быть запущена, должна фактически демонстрировать себя должным образом: разветвлять и отсоединять стандартные дескрипторы файлов, отсоединяться от терминала и начинать новый сеанс.

Изменить: очевидно, я ошибаюсь - двойное разветвление будет работать. https://stackoverflow.com/a/9646251/898699

-1
ответ дан 2 December 2019 в 22:16

Если это ваша программа, напишите, пожалуйста, ее как полноценный демон. Особенно если это для распространения. :)

Вы можете попробовать monit . Или, может быть, что-то вроде runit или daemontools. У этих могучих нет готовых пакетов. Daemontools от DJB, если это повлияет на ваше решение (в любом направлении).

-1
ответ дан 2 December 2019 в 22:16

Команда «не завершена», потому что функция демона не запускает ваше приложение в фоновом режиме. Вам нужно будет добавить & в конец вашей команды daemon следующим образом:

daemon --user someproguser $ exec &

If someprog не обрабатывает SIGHUP , вам следует запустить команду с nohup , чтобы гарантировать, что ваш процесс не получит SIGHUP , который сообщает вашему процессу о завершении, когда родительская оболочка завершает работу. Это будет выглядеть так:

daemon --user someproguser "nohup $ exec" &

В вашей функции stop killproc "exec" ничего не делает с остановите вашу программу. Он должен выглядеть так:

killproc $ exec

killproc требует полного пути к вашему приложению, чтобы его правильно остановить. В прошлом у меня были проблемы с killproc , поэтому вы также можете просто убить PID в PIDFILE, в который вы должны записать PID someprog , примерно так:

cat $ pidfile | xargs kill

Вы можете написать PIDFILE следующим образом:

ps aux | grep $ exec | grep -v grep | тр-с "" | cut -d "" -f2> $ pidfile

где $ pidfile указывает на /var/run/someprog.pid .

Если вы хотите [OK] или [ FAILED] в вашей функции stop , вы должны использовать функции success и failure из /etc/rc.d/init.d/functions . Они не нужны вам в функции start , потому что демон вызывает подходящий для вас.

Вам также нужны кавычки вокруг строк с пробелами. Однако это выбор стиля, так что решать вам.

Все эти изменения выглядят так:

#!/bin/bash
#
#   /etc/rc.d/init.d/someprog
#
# Starts the someprog daemon
#
# chkconfig: 345 80 20
# description: the someprog daemon
# processname: someprog
# config: /etc/someprog.conf

# Source function library.
. /etc/rc.d/init.d/functions

prog=someprog
exec=/usr/local/bin/$prog
[ -e /etc/sysconfig/$prog ] && . /etc/sysconfig/$prog
lockfile=/var/lock/subsys/$prog
pidfile=/var/run/$prog
RETVAL=0

check() {
    [ `id -u` = 0 ] || exit 4
    test -x $exec || exit 5
}

start() {
    check
    if [ ! -f $lockfile ]; then
        echo -n $"Starting $prog: " 
        daemon --user someproguser "nohup $exec" &
        RETVAL=$?
        if [ $RETVAL -eq 0 ]; then
          touch $lockfile
          ps aux | grep $exec | grep -v grep | tr -s " " | cut -d " " -f2 > $pidfile
        fi
        echo
    fi
    return $RETVAL
}

stop() {
    check
    echo -n $"Stopping $prog: "
    killproc $exec && cat $pidfile | kill
    RETVAL=$?
    if [ $RETVAL -eq 0 ]; then
      rm -f $lockfile
      rm -f $pidfile
      success; echo
    else
      failure; echo
    fi
    echo
    return $RETVAL
}

restart() {
    stop
    start
}   

case "$1" in
start)
    start
    ;;
stop)
    stop
    ;;
restart)
    restart
    ;;
status)
    status $prog
    RETVAL=$?
    ;;
*)
    echo $"Usage: $0 {start|stop|restart|status}"
    RETVAL=2
esac

exit $RETVAL
1
ответ дан 2 December 2019 в 22:16

Теги

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