如何为我的 Java 应用程序创建一个服务,以便使用 apache commons daemon jsvc 来运行它。该服务应在系统启动时启动。我搜索了又搜索,阅读了又阅读,尝试了很多东西,但似乎都不起作用。
我在路径中创建了一个 .sh 脚本/etc/init.d/
,并运行了“web”建议的所有必要命令,例如chmod 755 mydaemon.sh
和 或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
是空的。
但更奇怪的是,如果我将我的应用程序放在myscheduler.sh
ex 中/home/john/Downloads/test
并手动启动它,我就可以启动我的“jsvc”应用程序sh myscheduler.sh start
,这样它就可以正常工作,但似乎无法使其作为服务并在系统启动时运行update-rc.d ...
。
我是 Linux 新手,或者至少经验不是很多,我认为这可能是某些文件夹权限访问,我很乐意将其全部授予,chmod -R 777
但我很清楚后果以及它会对我的系统造成什么影响,之前尝试过一次或两次 xD。在 VirtualBox 上运行 Ubuntu 16.04,因此如果它坏了,我只需创建一个新映像。
答案1
找到了解决方案,必须在我的文件中设置EnvironmentFile=/etc/environment
和Type=forking
选项,.service
然后它就可以正常工作。