Я знаю, что это не обычный ответ, но я чувствовал, что этот POV должен появиться где-нибудь в ответах. Если Вы решаете использовать только бесплатное программное обеспечение, то в дополнение к ожидаемым преимуществам того, чтобы никогда быть искусственно ограниченным Вашим выбором программного обеспечения, лишенного информации, необходимой, чтобы заставить его работать, или не могущий законно совместно использовать его с другими, которые извлекли бы выгоду из него, Вы получаете удобный побочный эффект никогда необходимости волноваться об аудитах лицензирования программного обеспечения, количествах лицензии или условиях лицензионного соглашения (если Вы не перераспределяете программное обеспечение, в этом случае существуют определенные условия, но они очень легко удовлетворены).
Давным-давно я решил и как персональное и как коммерческое суждение для использования только бесплатного программного обеспечения. Если я не мог бы сделать этого с бесплатным программным обеспечением, дома или на работе, это не стоило делать. Моя жизнь стала очень упрощенной, и я никогда не сожалел о решении.
Я провел еще несколько исследований и, похоже, ответ - «вы не можете этого сделать». Программа, которая должна быть запущена, должна фактически демонстрировать себя должным образом: разветвлять и отсоединять стандартные дескрипторы файлов, отсоединяться от терминала и начинать новый сеанс.
Изменить: очевидно, я ошибаюсь - двойное разветвление будет работать. https://stackoverflow.com/a/9646251/898699
Если это ваша программа, напишите, пожалуйста, ее как полноценный демон. Особенно если это для распространения. :)
Вы можете попробовать monit . Или, может быть, что-то вроде runit или daemontools. У этих могучих нет готовых пакетов. Daemontools от DJB, если это повлияет на ваше решение (в любом направлении).
Команда «не завершена», потому что функция демона
не запускает ваше приложение в фоновом режиме. Вам нужно будет добавить &
в конец вашей команды 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