如何为我的 java 应用程序创建一个服务,我必须使用 apache commons daemon jsvc 运行它。该服务应在系统引导时启动。我已经搜索和搜索,阅读和阅读并尝试了很多东西,但似乎没有任何效果。
我在/etc/init.d/
路径中创建了一个 .sh 脚本并运行“web”建议的所有必要命令,例如chmod 755 mydaemon.sh
and or chmod +x mydaemon.sh
,在没有 的情况下输入时不起作用.sh
,所以我不知道为什么人们会这样建议。但看起来这可能是 v.15 之前的旧方法。好吧,至少我发现有些人说它已被弃用,而 systemd 是新的黑色。
我还尝试创建一个 mydamon.service 文件,/etc/systemd/system
将 ExecStart 和 Stop 指向我的 .sh 脚本。我已经完成了所有systemctl daemon-realod
-> systemctl start myservice
。这是我的.service
文件的示例
[Unit]
Description=Scheduler Test
[Service]
ExecStart=/etc/init.d/myscheduler.sh start
ExecStop=/etc/init.d/myscheduler.sh stop
[Install]
WantedBy=multi-user.target
这是我的.sh
脚本的一个例子
#!/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
但是当我尝试启动它时没有任何反应,目前它立即启动和停止。看起来我的应用程序无法读取我在文件中指向的属性文件之一/etc/environment
:
quartzconfig="/usr/local/myscheduler/quartz.properties"
我的应用程序的主要类如下所示:
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.");
}
}
正如我从日志中看到的那样,它path
是空的。
但更奇怪的是,如果我将我的例如放在 ex 中,我可以启动我的“jsvc”应用程序myscheduler.sh
。/home/john/Downloads/test
并手动启动它,sh myscheduler.sh start
然后它工作正常,但似乎无法使其作为服务和系统启动工作update-rc.d ...
。
我是 linux 新手,或者至少没有那么丰富的经验,我认为这可能是一些文件夹权限访问,我很想给它一个全部chmod -R 777
但我很清楚后果以及它可以做什么我的系统,在xD之前尝试过一次或两次。在 VirtualBox 上运行 Ubuntu 16.04,所以如果它坏了我只创建一个新图像。
找到解决方案,必须在我的文件中设置
EnvironmentFile=/etc/environment
和Type=forking
选项,.service
然后它工作正常。