[英]Linux start-up script for java application
I have Jar file to run in Linux using this command: 我有使用以下命令在Linux中运行的Jar文件:
java -jar SyslogAgent_01.jar 192.168.2.154 1998 D:/apachelog.log ApacheLog 13
Can anyone let me know how to create script and implement this process automatically while we restart our computer? 有人可以让我知道如何在重新启动计算机时自动创建脚本并实现此过程吗? In windows we use services but how about linux?
在Windows中,我们使用服务,但是linux呢? Can u provide to me the script and step to do that since i am really new in Linux...
您能提供给我脚本和执行此操作的步骤吗,因为我确实是Linux的新手。
Linux : RHat, Ubuntu Linux:RHat,Ubuntu
Thanks 谢谢
If you want to run the app as linux daemon (service) checkout Java Wrapper: http://wrapper.tanukisoftware.com/doc/english/download.jsp 如果您想将应用程序作为linux守护程序(服务)运行,请签出Java包装程序: http : //wrapper.tanukisoftware.com/doc/english/download.jsp
Check this answer too (is for windows, but for linux changes a little bit): How to install a Java application as a service 也请检查以下答案(适用于Windows,但适用于Linux的情况略有变化): 如何将Java应用程序作为服务安装
I would start with this template for a startup script rename the SCRIPT_HOME
to proper path and call this file without any extensions, then in SSH run this command. 我将从启动脚本的模板开始,将
SCRIPT_HOME
重命名为正确的路径,然后调用该文件而不进行任何扩展,然后在SSH中运行此命令。
chkconfig –add javaserver
Note the javaserver
in the chkconfig
is how you called the file below, (no extensions or it wont work). 请注意,
chkconfig
的javaserver
是如何调用下面的文件(无扩展名,否则将无法正常工作)。
#!/bin/bash
#
# javaserver: Startup script for Any Server Application.
#
# chkconfig: 35 80 05
# description: Startup script for Any Server Application.
SCRIPT_HOME=/var/java_server;
export SCRIPT_HOME
start() {
echo -n "Starting Java Server: "
$SCRIPT_HOME/run.sh start
sleep 2
echo "done"
}
stop() {
echo -n "Stopping Java Server: "
$SCRIPT_HOME/run.sh stop
echo "done"
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
*)
echo $"Usage: javaserver {start|stop|restart}"
exit
esac
Now here is the script the run.sh (this can be used instead of the template but I find it easier to make the template script small and unchangeable link to my main script so I never have to touch it again. 现在这里是脚本run.sh(可以代替模板使用该脚本,但是我发现更容易使模板脚本更小且无法更改到我的主脚本的链接,因此我无需再次触摸它。
The script below is one of a very few scripts I found that actually can restart a java program without turning off all the java programs you currently have running, this one only targets the program it opened in the first place so it will never make any mistakes, never had it fail on me, run on user root
no problem. 下面的脚本是我发现的少数几个脚本之一,它们实际上可以在不关闭当前正在运行的所有Java程序的情况下重新启动Java程序,该脚本仅针对最初打开的程序,因此它永远不会出错,从来没有对我失败,在
root
用户上运行没问题。
Runs your program in the background forever too (no need to keep SSH opened). 永远在后台运行程序(无需保持SSH打开状态)。
This is the run.sh
这是
run.sh
#!/bin/bash
#
# chkconfig: 345 99 05
# description: Java deamon script
#
# A non-SUSE Linux start/stop script for Java daemons.
#
# Set this to your Java installation
JAVA_HOME=/usr/bin/
scriptFile=$(readlink -fn $(type -p $0)) # the absolute, dereferenced path of this script file
scriptDir=$(dirname $scriptFile) # absolute path of the script directory
serviceNameLo="javaserver" # service name with the first letter in lowercase
serviceName="JavaServer" # service name
serviceUser="root" # OS user name for the service
serviceGroup="root" # OS group name for the service
applDir="/var/java_server" # home directory of the service application
serviceUserHome="/home/$serviceUser" # home directory of the service user
serviceLogFile="/var/log/$serviceNameLo.log" # log file for StdOut/StdErr
maxShutdownTime=15 # maximum number of seconds to wait for the daemon to terminate normally
pidFile="/var/run/$serviceNameLo.pid" # name of PID file (PID = process ID number)
javaCommand="java" # name of the Java launcher without the path
javaArgs="MyJavaAppClass" # arguments for Java launcher
javaCommandLine="$JAVA_HOME$javaCommand $javaArgs" # command line to start the Java service application
javaCommandLineKeyword="MyJavaAppClass" # a keyword that occurs on the commandline, used to detect an already running service process and to distinguish it from others
# Makes the file $1 writable by the group $serviceGroup.
function makeFileWritable {
local filename="$1"
touch $filename || return 1
chgrp $serviceGroup $filename || return 1
chmod g+w $filename || return 1
return 0; }
# Returns 0 if the process with PID $1 is running.
function checkProcessIsRunning {
local pid="$1"
if [ -z "$pid" -o "$pid" == " " ]; then return 1; fi
if [ ! -e /proc/$pid ]; then return 1; fi
return 0; }
# Returns 0 if the process with PID $1 is our Java service process.
function checkProcessIsOurService {
local pid="$1"
if [ "$(ps -p $pid --no-headers -o comm)" != "$javaCommand" ]; then return 1; fi
grep -q --binary -F "$javaCommandLineKeyword" /proc/$pid/cmdline
if [ $? -ne 0 ]; then return 1; fi
return 0; }
# Returns 0 when the service is running and sets the variable $pid to the PID.
function getServicePID {
if [ ! -f $pidFile ]; then return 1; fi
pid="$(<$pidFile)"
checkProcessIsRunning $pid || return 1
checkProcessIsOurService $pid || return 1
return 0; }
function startServiceProcess {
cd $applDir || return 1
rm -f $pidFile
makeFileWritable $pidFile || return 1
makeFileWritable $serviceLogFile || return 1
cmd="nohup $javaCommandLine >>$serviceLogFile 2>&1 & echo \$! >$pidFile"
# Don't forget to add -H so the HOME environment variable will be set correctly.
#sudo -u $serviceUser -H $SHELL -c "$cmd" || return 1
su --session-command="$javaCommandLine >>$serviceLogFile 2>&1 & echo \$! >$pidFile" $serviceUser || return 1
sleep 0.1
pid="$(<$pidFile)"
if checkProcessIsRunning $pid; then :; else
echo -ne "\n$serviceName start failed, see logfile."
return 1
fi
return 0; }
function stopServiceProcess {
kill $pid || return 1
for ((i=0; i<maxShutdownTime*10; i++)); do
checkProcessIsRunning $pid
if [ $? -ne 0 ]; then
rm -f $pidFile
return 0
fi
sleep 0.1
done
echo -e "\n$serviceName did not terminate within $maxShutdownTime seconds, sending SIGKILL..."
kill -s KILL $pid || return 1
local killWaitTime=15
for ((i=0; i<killWaitTime*10; i++)); do
checkProcessIsRunning $pid
if [ $? -ne 0 ]; then
rm -f $pidFile
return 0
fi
sleep 0.1
done
echo "Error: $serviceName could not be stopped within $maxShutdownTime+$killWaitTime seconds!"
return 1; }
function startService {
getServicePID
if [ $? -eq 0 ]; then echo -n "$serviceName is already running"; RETVAL=0; return 0; fi
echo -n "Starting $serviceName "
startServiceProcess
if [ $? -ne 0 ]; then RETVAL=1; echo "failed"; return 1; fi
echo "started PID=$pid"
RETVAL=0
return 0; }
function stopService {
getServicePID
if [ $? -ne 0 ]; then echo -n "$serviceName is not running"; RETVAL=0; echo ""; return 0; fi
echo -n "Stopping $serviceName "
stopServiceProcess
if [ $? -ne 0 ]; then RETVAL=1; echo "failed"; return 1; fi
echo "stopped PID=$pid"
RETVAL=0
return 0; }
function checkServiceStatus {
echo -n "Checking for $serviceName: "
if getServicePID; then
echo "running PID=$pid"
RETVAL=0
else
echo "stopped"
RETVAL=3
fi
return 0; }
function main {
RETVAL=0
case "$1" in
start) # starts the Java program as a Linux service
startService
;;
stop) # stops the Java program service
stopService
;;
restart) # stops and restarts the service
stopService && startService
;;
status) # displays the service status
checkServiceStatus
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
exit 1
;;
esac
exit $RETVAL
}
main $1
While it is not recommended to sudo items like this, it can be accomplished by the following: 虽然不建议对这样的项目进行sudo,但可以通过以下方法实现:
sudo crontab -e
Place the following in the cron: 将以下内容放在cron中:
@reboot java -jar SyslogAgent_01.jar 192.168.2.154 1998 D:/apachelog.log ApacheLog 13
Uhh first you might want to edit out your local ip thats more information that your giving out. 嗯,首先,您可能希望编辑出您的本地IP多数民众赞成在您提供的更多信息。 Anyhow just open up a new document type this
无论如何,打开一个新的文档类型
#!/bin/bash
#put your commands in here
Save then open up terminal and type chmod +x nameofscript 保存然后打开终端,然后输入chmod + x nameofscript
Im not sure about ubuntu but on arch we have a place to run commands on startup. 我不确定ubuntu,但在arch上,我们有一个在启动时运行命令的地方。 My advice is to goto system->prefernces->start up applications or something along that line its in that menu I know.
我的建议是转到系统->偏好设置->启动应用程序,或者在我知道的菜单中启动该程序。
Type the path to the script ie /home/username/scrips/myawesomescript 输入脚本的路径,即/ home / username / scrips / myawesomescript
Basically, you need to create a little shell script in /etc/init.d and make symlinks to /etc/rc2.d and /etc/rc5.d. 基本上,您需要在/etc/init.d中创建一个小的Shell脚本,并建立到/etc/rc2.d和/etc/rc5.d的符号链接。 The contents could be like this:
内容可能是这样的:
#!/bin/sh
if [ "$1" = start ] ; then
cd /put_your_workdir_here
/usr/bin/java -jar SyslogAgent_01.jar 192.168.2.154 1998 D:/apachelog.log ApacheLog 13 &
fi
Notice that you start your program in background (& at the end of the commandline) 请注意,您是在后台启动程序的(命令行末尾的&)
you need to create a unix shell script file, that will automate the job for you. 您需要创建一个unix shell脚本文件,该文件将为您自动执行作业。 Here are the steps to create the script file: http://www.linuxquestions.org/questions/linux-general-1/shell-script-for-jar-utility-769461/
以下是创建脚本文件的步骤: http : //www.linuxquestions.org/questions/linux-general-1/shell-script-for-jar-utility-769461/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.