Inicializar programa como serviço
Bom dia pessoal,
Estou precisando iniciar um programa no SUSE como daemon. Eu consegui fazer com que o programa suba na inicialização do SUSE colocando os comandos no /etc/init.d/boot.local, porém, preciso que seja como daemon, para que possa utilizar o start, stop, restart e etc. Da forma que coloquei, não consigo, ele apenas sobe e da o PID. Alguém poderia me ajudar a subir programas como daemon? Desde já agradeço.
Atenciosamente,
Re: Inicializar programa como serviço
Citação:
Postado originalmente por
tifoski
...Estou precisando iniciar um programa no SUSE como daemon. Eu consegui fazer com que o programa suba na inicialização do SUSE colocando os comandos no /etc/init.d/boot.local, porém, preciso que seja como daemon, para que possa utilizar o start, stop, restart e etc. Da forma que coloquei, não consigo, ele apenas sobe e da o PID. Alguém poderia me ajudar a subir programas como daemon?
Você pode seguir as sugestões do template[1] de script de inicialização, ou também seguir tutoriais[2][3] que atendem especificamente sua necessidade.
Um dos tutoriais[2] demonstra como instanciar uma aplicação Java, como serviço, no OpenSUSE. Com pequenos ajustes, é possível alterar para qualquer outro executável, diferente da aplicação Java, proposta originalmente no tutorial. Em outro tutorial[3], o exemplo é semelhante, entretanto de propósito geral.
Citação:
Postado originalmente por
tifoski
Desde já agradeço.
Mantenha-nos informado sobre seu progresso :)
[1] /etc/init.d/skeleton
[2] http://www.source-code.biz/snippets/java/7.htm
[3] http://www.novell.com/coolsolutions/feature/15380.html
Re: Inicializar programa como serviço
Citação:
Postado originalmente por
trober
Você pode seguir as sugestões do template[1] de script de inicialização, ou também seguir tutoriais[2][3] que atendem especificamente sua necessidade.
Um dos tutoriais[2] demonstra como instanciar uma aplicação Java, como serviço, no OpenSUSE. Com pequenos ajustes, é possível alterar para qualquer outro executável, diferente da aplicação Java, proposta originalmente no tutorial. Em outro tutorial[3], o exemplo é semelhante, entretanto de propósito geral.
Mantenha-nos informado sobre seu progresso :)
[1] /etc/init.d/skeleton
[2]
http://www.source-code.biz/snippets/java/7.htm
[3]
http://www.novell.com/coolsolutions/feature/15380.html
Bom dia,
Cara, consegui fazer funcionar, ele sobe certinho, consigo dar start, ver o status, mas não estou conseguindo dar um stop no serviço. Já fiz diversas modificações para dar o stop mas ele não da este stop. Segue o meu script para ter uma noção dele como um todo:
Código :
[FONT=arial]### BEGIN INIT INFO[/FONT]
[FONT=arial]# Provides: TRANSX[/FONT]
[FONT=arial]# Required-Start: $syslog $remote_fs[/FONT]
[FONT=arial]# Required-Stop: $syslog [/FONT]
[FONT=arial]# Default-Start: 3 5[/FONT]
[FONT=arial]# Default-Stop: [/FONT]
[FONT=arial]# Description: Servico TRANSX[/FONT]
[FONT=arial]### END INIT INFO[/FONT]
[FONT=arial]
[/FONT]
[FONT=arial]
[/FONT]
[FONT=arial]
[/FONT]
[FONT=arial]
[/FONT]
[FONT=arial]SERV=transx[/FONT]
[FONT=arial]APPPATH="/transx/recargametro"[/FONT]
[FONT=arial]JAVA_BIN="/root/jdk1.7.0_25/bin/java"[/FONT]
[FONT=arial]
[/FONT]
[FONT=arial]
[/FONT]
[FONT=arial]PAYLOAD="transx-1.0.103.jar"[/FONT]
[FONT=arial]PIDFILE="/var/run/$SERV.pid"[/FONT]
[FONT=arial]
[/FONT]
[FONT=arial]start() {[/FONT]
[FONT=arial] echo -n "Starting $SERV: "[/FONT]
[FONT=arial] if [ -f $PIDFILE ]; then[/FONT]
[FONT=arial] PID=`cat $PIDFILE`[/FONT]
[FONT=arial] echo $SERV already running $PID.[/FONT]
[FONT=arial] exit 2;[/FONT]
[FONT=arial] else[/FONT]
[FONT=arial] cd $APPPATH[/FONT]
[FONT=arial] nohup $JAVA_BIN -jar $PAYLOAD &> /dev/null &[/FONT]
[FONT=arial] RETVAL=$?[/FONT]
[FONT=arial] [ $RETVAL -eq 0 ] && touch $PIDFILE && echo `ps aux | grep $PAYLOAD | grep -v grep | awk {'print $2'}` > $PIDFILE[/FONT]
[FONT=arial] echo OK[/FONT]
[FONT=arial] return $RETVAL[/FONT]
[FONT=arial] fi[/FONT]
[FONT=arial]
[/FONT]
[FONT=arial]}[/FONT]
[FONT=arial]
[/FONT]
[FONT=arial]stop() {[/FONT]
[FONT=arial] echo -n "Stopping $SERV: "[/FONT]
[FONT=arial] if [ -f $PIDFILE ]; then[/FONT]
[FONT=arial] PID=`cat $PIDFILE`[/FONT]
[FONT=arial] kill $PID && rm -f $PIDFILE[/FONT]
[FONT=arial] echo OK[/FONT]
[FONT=arial] return 0[/FONT]
[FONT=arial] else[/FONT]
[FONT=arial] echo "not running or pid file is gone."[/FONT]
[FONT=arial] fi[/FONT]
[FONT=arial]}[/FONT]
[FONT=arial]
[/FONT]
[FONT=arial]status() {
if [ -f $PIDFILE ]; then
echo "running"
return 0
else
echo "not running"
return 1
fi
}
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status
;;
restart)
stop
start
;;
*)
echo "Usage: {start|stop|restart}"
exit 1
;;
esac
exit $?
[/FONT]
Re: Inicializar programa como serviço
Citação:
Postado originalmente por
tifoski
Bom dia,
Cara, consegui fazer funcionar, ele sobe certinho, consigo dar start, ver o status, mas não estou conseguindo dar um stop no serviço. Já fiz diversas modificações para dar o stop mas ele não da este stop. Segue o meu script para ter uma noção dele como um todo:
Código :
### BEGIN INIT INFO
# Provides: TRANSX
# Required-Start: $syslog $remote_fs
# Required-Stop: $syslog
# Default-Start: 3 5
# Default-Stop:
# Description: Servico TRANSX
### END INIT INFO
SERV=transx
APPPATH="/transx/recargametro"
JAVA_BIN="/root/jdk1.7.0_25/bin/java"
PAYLOAD="transx-1.0.103.jar"
PIDFILE="/var/run/$SERV.pid"
start() {
echo -n "Starting $SERV: "
if [ -f $PIDFILE ]; then
PID=`cat $PIDFILE`
echo $SERV already running $PID.
exit 2;
else
cd $APPPATH
nohup $JAVA_BIN -jar $PAYLOAD &> /dev/null &
RETVAL=$?
[ $RETVAL -eq 0 ] && touch $PIDFILE && echo `ps aux | grep $PAYLOAD | grep -v grep | awk {'print $2'}` > $PIDFILE
echo OK
return $RETVAL
fi
}
stop() {
echo -n "Stopping $SERV: "
if [ -f $PIDFILE ]; then
PID=`cat $PIDFILE`
kill $PID && rm -f $PIDFILE
echo OK
return 0
else
echo "not running or pid file is gone."
fi
}
status() {
if [ -f $PIDFILE ]; then
echo "running"
return 0
else
echo "not running"
return 1
fi
}
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status
;;
restart)
stop
start
;;
*)
echo "Usage: {start|stop|restart}"
exit 1
;;
esac
exit $?
Ao publicar códigos e porções de script, recomendo usar a TAG CODE, para formatar a aparência, promovendo assim maior legibilidade :)
Em relação a impossibilidade de parar o serviço, faço as seguintes perguntas:
1) O arquivo /var/run/transx.pid está sendo criado?
2) Se a resposta for sim, para a pergunta anterior, o PID é condizente com o PID do processo de "recargametro"?
3) Não é redundante o uso de 'nohup' num script de serviço?
Re: Inicializar programa como serviço
Citação:
Postado originalmente por
trober
Ao publicar códigos e porções de script, recomendo usar a TAG CODE, para formatar a aparência, promovendo assim maior legibilidade :)
Em relação a impossibilidade de parar o serviço, faço as seguintes perguntas:
1) O arquivo /var/run/transx.pid está sendo criado?
2) Se a resposta for sim, para a pergunta anterior, o PID é condizente com o PID do processo de "recargametro"?
3) Não é redundante o uso de 'nohup' num script de serviço?
Bom dia, desculpe, utilizarei da próxima.
Resposta para as questões 1 e 2: sim.
Referente a questão 3: Ainda sou iniciante no linux, então tenho muitas dificuldades. O nohup já era usado para iniciar a aplicação manualmente nos servidores da empresa, por isso continuei utilizando ele. Há alguma forma de colocar este serviço no ar, sem o nohup neste script?
Atenciosamente,
Lucas Farias
Re: Inicializar programa como serviço
Citação:
Postado originalmente por
tifoski
...desculpe, utilizarei da próxima...
Sem crise Lucas :)
Citação:
Postado originalmente por
tifoski
Há alguma forma de colocar este serviço no ar, sem o nohup neste script?
Abaixo disponho código que testei no Ubuntu. No meu teste, usei Python, em vez de Java, e o payload foi um builtin, sem o parâmetro -jar. Readaptei para seu aplicativo, após ajustes, e publico o script para que faça os devidos testes :)
Tirei o "touch", por ser redundante (afinal você já tinha uma saída ">"), e fiz ajustes num grep, que estava dando erro de "invalid max count". Também melhorei o retorno de status, adicionando o número do processo.
Código :
### BEGIN INIT INFO
# Provides: TRANSX
# Required-Start: $syslog $remote_fs
# Required-Stop: $syslog
# Default-Start: 3 5
# Default-Stop:
# Description: Servico TRANSX
### END INIT INFO
SERV=transx
APPPATH="/transx/recargametro"
JAVA_BIN="/root/jdk1.7.0_25/bin/java"
PAYLOAD="transx-1.0.103.jar"
PIDFILE="/var/run/$SERV.pid"
start() {
echo -n "Starting $SERV: "
if [ -f $PIDFILE ]; then
PID=`cat $PIDFILE`
echo $SERV already running $PID.
exit 2;
else
cd $APPPATH
$JAVA_BIN -jar $PAYLOAD &> /dev/null &
RETVAL=$?
[ $RETVAL -eq 0 ] && echo `ps aux | grep -- "$PAYLOAD" | grep -v grep | awk {'print $2'}` > $PIDFILE
echo OK
return $RETVAL
fi
}
stop() {
echo -n "Stopping $SERV: "
if [ -f $PIDFILE ]; then
PID=`cat $PIDFILE`
kill $PID && rm -f $PIDFILE
echo OK
return 0
else
echo "not running or pid file is gone."
fi
}
status() {
if [ -f $PIDFILE ]; then
PID=`cat $PIDFILE`
echo "running at PID" $PID.
return 0
else
echo "not running"
return 1
fi
}
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status
;;
restart)
stop
start
;;
*)
echo "Usage: {start|stop|restart}"
exit 1
;;
esac
exit $?
Faça o teste, e mantenha-nos informado :)
Re: Inicializar programa como serviço
Citação:
Postado originalmente por
trober
Sem crise Lucas :)
Abaixo disponho código que testei no Ubuntu. No meu teste, usei Python, em vez de Java, e o payload foi um
builtin, sem o parâmetro -jar. Readaptei para seu aplicativo, após ajustes, e publico o script para que faça os devidos testes :)
Tirei o "touch", por ser redundante (afinal você já tinha uma saída ">"), e fiz ajustes num grep, que estava dando erro de "
invalid max count". Também melhorei o retorno de
status, adicionando o número do processo.
Código :
### BEGIN INIT INFO
# Provides: TRANSX
# Required-Start: $syslog $remote_fs
# Required-Stop: $syslog
# Default-Start: 3 5
# Default-Stop:
# Description: Servico TRANSX
### END INIT INFO
SERV=transx
APPPATH="/transx/recargametro"
JAVA_BIN="/root/jdk1.7.0_25/bin/java"
PAYLOAD="transx-1.0.103.jar"
PIDFILE="/var/run/$SERV.pid"
start() {
echo -n "Starting $SERV: "
if [ -f $PIDFILE ]; then
PID=`cat $PIDFILE`
echo $SERV already running $PID.
exit 2;
else
cd $APPPATH
$JAVA_BIN -jar $PAYLOAD &> /dev/null &
RETVAL=$?
[ $RETVAL -eq 0 ] && echo `ps aux | grep -- "$PAYLOAD" | grep -v grep | awk {'print $2'}` > $PIDFILE
echo OK
return $RETVAL
fi
}
stop() {
echo -n "Stopping $SERV: "
if [ -f $PIDFILE ]; then
PID=`cat $PIDFILE`
kill $PID && rm -f $PIDFILE
echo OK
return 0
else
echo "not running or pid file is gone."
fi
}
status() {
if [ -f $PIDFILE ]; then
PID=`cat $PIDFILE`
echo "running at PID" $PID.
return 0
else
echo "not running"
return 1
fi
}
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status
;;
restart)
stop
start
;;
*)
echo "Usage: {start|stop|restart}"
exit 1
;;
esac
exit $?
Faça o teste, e mantenha-nos informado :)
Com estes ajustes o Stop não está funcionando e o PID não aparece, apenas aparece a palavra PID, mas não o número do processo. Quando dou um cat /var/run/transx.pid, ele retorna em branco :/ sabe o que pode ser?
Re: Inicializar programa como serviço
Citação:
Postado originalmente por
tifoski
Com estes ajustes o Stop não está funcionando e o PID não aparece, apenas aparece a palavra PID, mas não o número do processo. Quando dou um cat /var/run/transx.pid, ele retorna em branco :/ sabe o que pode ser?
Roda "na mão" o comando abaixo, substituindo seu $PAYLOAD, e diga o que aparece. Mantenha as aspas duplas (double quotes).
Código :
ps aux | grep -- "$PAYLOAD" | grep -v grep | awk {'print $2'}
Re: Inicializar programa como serviço
Citação:
Postado originalmente por
trober
Roda "na mão" o comando abaixo, substituindo seu $PAYLOAD, e diga o que aparece. Mantenha as aspas duplas (double quotes).
Código :
ps aux | grep -- "$PAYLOAD" | grep -v grep | awk {'print $2'}
Olha,
Deixei da seguinte forma e funcionou:
Código :
ps aux | grep $PAYLOAD | grep -v grep | awk {'print $2'}
[/QUOTE]
O unico problema agora é o Stop, está acontecendo da seguinte forma. Eu dou o comando /etc/init.d/transx stop e ele me retorna a seguinte mensagem:
Código :
Stopping transx: /etc/init.d/transx: Line 38: kill: 2909 (PID):Invalid signal specification OK
[QUOTE]
Após isso, vou no script, altero o kill para kill -l, ele retorna a mensagem, quando retorno para kill apenas, ele começa a dar o stop normalmente, mas se reinicio o server, volta a dar a mesma mensagem.
Atenciosamente,
Lucas Farias
Re: Inicializar programa como serviço
Citação:
Postado originalmente por
tifoski
...altero o kill para kill -l, ele retorna a mensagem, quando retorno para kill apenas, ele começa a dar o stop normalmente, mas se reinicio o server, volta a dar a mesma mensagem.
Lucas, experimenta "kill -9".
Re: Inicializar programa como serviço
Citação:
Postado originalmente por
trober
Lucas, experimenta "kill -9".
Agora da a seguinte mensagem:
Código :
Stopping transx: kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
E o problema do pid voltou, ele aparece apenas: Running at PID .
Ta funcionando mas ta doido isso hahaahha
Atenciosamente,
Lucas Farias
Re: Inicializar programa como serviço
Citação:
Postado originalmente por
trober
Lucas, experimenta "kill -9".
Arrumei da seguinte forma:
Código :
start() {
19 echo -n "Starting $SERV: "
20 if [ -f $PIDFILE ]; then
21 PID=`cat $PIDFILE`
22 echo $SERV already running $PID
23 exit 2;
24 else
25
26 cd $APPPATH
27
28 $JAVA_BIN -jar $PAYLOAD &> log/Saida.txt &
29 PID=`echo $!` (encontra o ultimo PID que foi startado)
30 echo $PID > $PIDFILE
31 RETVAL=$?
32 [ $RETVAL -eq 0 ]
33 #echo `ps aux | grep "$PAYLOAD" | grep -v grep | awk {'print $2'}` > $PIDFILE
34 echo OK
35 return $RETVAL
Desta forma ele está capturando o pid certinho e consegue dar o kill na aplicação. Está funcionando corretamente. Muito obrigado pela grande ajuda.
Atenciosamente,
Lucas Farias
Re: Inicializar programa como serviço
Citação:
Postado originalmente por
tifoski
Está funcionando corretamente.
Que boa notícia Lucas :)
Tem como dispor o código na íntegra, aqui no Under-Linux, em mensagem formatada, ou dispor ad eternum no Pastebin[1]? :)
[1] http://pastebin.com
Re: Inicializar programa como serviço
Citação:
Postado originalmente por
trober
Que boa notícia Lucas :)
Tem como dispor o código na íntegra, aqui no Under-Linux, em mensagem formatada, ou dispor
ad eternum no Pastebin[1]? :)
[1]
http://pastebin.com
Estou disponibilizando aqui e também disponibilizarei no pastebin. Segue:
Código :
###BEGIN INIT INFO
# Provides: TRANSX
# Required-Start: $syslog $remote_fs
# Required-Stop: $syslog
# Default-Start: 3 5
# Default-Stop:
# Description: Servico TRANSX
### END INIT INFO
SERV=transx
APPPATH="/transx/recargametro"
JAVA_BIN="/root/jdk1.7.0_25/bin/java"
PAYLOAD="transx-1.0.103.jar"
PIDFILE="/var/run/$SERV.pid"
start() {
echo -n "Starting $SERV: "
if [ -f $PIDFILE ]; then
PID=`cat $PIDFILE`
echo $SERV already running $PID
exit 2;
else
cd $APPPATH
$JAVA_BIN -jar $PAYLOAD &>log/Saida.txt &
PID=`echo $!`
echo $PID > $PIDFILE
RETVAL=$?
[ $RETVAL -eq 0 ]
#echo `ps aux | grep "$PAYLOAD" |grep -v grep | awk {'print $2'}` > $PIDFILE
echo OK
return $RETVAL
fi
}
stop() {
echo -n "Stopping $SERV: "
if [ -f $PIDFILE ]; then
PID=`cat $PIDFILE`
kill $PID
rm -f $PIDFILE
#echo kill $PID rm -f $PIDFILE
echo OK
return 0
else
echo "not running or pid file is gone."
fi
}
status() {
if [ -f $PIDFILE ]; then
PID=`cat $PIDFILE`
echo "running at PID" $PID.
return 0
else
echo "not running"
return 1
fi
}
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status
;;
restart)
stop
start
;;
*)
echo "Usage: {start|stop|restart}"
exit 1
;;
esac
exit $?