Encontrei a solução, tive que definir a opção EnvironmentFile=/etc/environment
e Type=forking
no meu arquivo .service
, então funcionou bem.
Como faço para criar um serviço para o meu aplicativo java, onde eu tenho que executá-lo com o daemon apache commons jsvc. O serviço deve ser iniciado na inicialização do sistema. Eu procurei e pesquisei, li e li e tentei muitas coisas, e nada parece funcionar.
Eu criei um script .sh no caminho /etc/init.d/
e executei todos os comandos necessários que a "web" sugeriu como chmod 755 mydaemon.sh
e ou chmod +x mydaemon.sh
, não funciona quando digitado sem o .sh
, então Eu não sei porque as pessoas sugerem isso.
Mas parece que isso pode ser uma abordagem antiga antes da v.15. Bem, pelo menos eu descobri que algumas pessoas dizem que ele está obsoleto e que systemd é o novo preto.
Eu também tentei criar um arquivo mydamon.service em /etc/systemd/system
apontando o script ExecStart e Stop to my .sh.
Eu fiz todo o systemctl daemon-realod
- > %código%. Aqui está um exemplo do meu arquivo systemctl start myservice
[Unit]
Description=Scheduler Test
[Service]
ExecStart=/etc/init.d/myscheduler.sh start
ExecStop=/etc/init.d/myscheduler.sh stop
[Install]
WantedBy=multi-user.target
aqui está um exemplo do meu script .service
#!/bin/sh
### BEGIN INIT INFO
#
# Provides: myscheduler
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start the myscheduler service
# Description: This file is used to start the daemon and should be placed in /etc/init.d
### END INIT INFO
NAME="myscheduler"
DESC="MyScheduler service"
EXEC=/usr/bin/jsvc
FILE_PATH="/usr/local/$NAME"
#JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
CLASS_PATH="$FILE_PATH/lib/commons-daemon-1.0.15.jar":"$FILE_PATH/myscheduler.jar"
CLASS="com.example.ApiApplication"
USER="root"
PID=$FILE_PATH/example.pid
LOG_OUT=$FILE_PATH/example.out
LOG_ERR=$FILE_PATH/example.err
jsvc_exec()
{
cd $FILE_PATH
$EXEC -home $JAVA_HOME -cp $CLASS_PATH -user $USER -outfile $LOG_OUT -errfile $LOG_ERR -pidfile $PID $1 $CLASS
}
case "$1" in
start)
echo "Starting the $DESC..."
jsvc_exec
echo "The $DESC has started."
;;
stop)
echo "Stopping the $DESC..."
jsvc_exec "-stop"
echo "The $DESC has stopped."
;;
restart)
if [ -f "$PID" ]; then
echo "Restarting the $DESC..."
jsvc_exec "-stop"
jsvc_exec
echo "The $DESC has restarted."
else
echo "Service $DESC not running, no action taken."
exit 1
fi
;;
*)
echo "usage: daemon {start|stop|restart}" >&2
exit 3
;;
esac
Mas nada acontece quando tento iniciá-lo, atualmente ele inicia e pára imediatamente. Parece que meu aplicativo não pode ler um dos meus arquivos de propriedades para o qual estou apontando no arquivo .sh
:
quartzconfig="/usr/local/myscheduler/quartz.properties"
A classe principal da minha inscrição pode ser vista abaixo:
public class ApiApplication implements Daemon{
private static Scheduler scheduler;
public static void main(String[] args) {
try {
String path = System.getenv("quartzconfig");
System.out.println(path);
Properties props = new Properties();
Parameters parameters = new Parameters();
FileBasedConfigurationBuilder<FileBasedConfiguration> builder = new FileBasedConfigurationBuilder<FileBasedConfiguration>(PropertiesConfiguration.class)
.configure(parameters.properties().setFileName(path));
Configuration config = builder.getConfiguration();
props = ConfigurationConverter.getProperties(config);
SchedulerFactory sf = new StdSchedulerFactory(props);
scheduler = sf.getScheduler();
scheduler.start();
} catch (SchedulerException se){
se.printStackTrace();
} catch(ConfigurationException ioe){
ioe.printStackTrace();
System.err.println("Could not load properties... something went wrong!");
}
}
@Override
public void init(DaemonContext daemonContext) throws DaemonInitException, Exception {
System.out.println("initializing...");
}
@Override
public void start() throws Exception {
System.out.println("starting...");
main(null);
}
@Override
public void stop() throws Exception {
System.out.println("stopping...");
// if process is stopped gracefully shutdown the scheduler
scheduler.shutdown();
}
@Override
public void destroy() {
System.out.println("done.");
}
}
E como eu posso ver no log /etc/environment
é nulo.
Mas o que é mais estranho é que eu posso iniciar meu aplicativo "jsvc" se eu forexemplo colocar meu path
no ex. myscheduler.sh
e inicie manualmente como /home/john/Downloads/test
, então funciona bem, mas parece que não consegue funcionar como um serviço e na inicialização do sistema sh myscheduler.sh start
.
Eu sou novo no Linux, ou pelo menos não tão bem experiente, estou pensando que pode ser algum acesso de permissão de pasta de arquivo, eu adoraria apenas dar tudo um update-rc.d ...
, mas estou bem ciente das consequências e o que ele poderia fazer no meu sistema, tentei uma ou duas vezes antes do xD. Rodando o Ubuntu 16.04 no VirtualBox, basta criar uma nova imagem se ela quebrar.
Encontrei a solução, tive que definir a opção EnvironmentFile=/etc/environment
e Type=forking
no meu arquivo .service
, então funcionou bem.