gpt4 book ai didi

java - Java 应用程序的 Linux 启动脚本

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:25:11 25 4
gpt4 key购买 nike

我有 Jar 文件可以在 Linux 中使用这个命令运行:

java -jar SyslogAgent_01.jar 192.168.2.154 1998 D:/apachelog.log ApacheLog 13

谁能告诉我如何创建脚本并在我们重新启动计算机时自动执行此过程?在 Windows 中我们使用服务,但是在 Linux 中呢?你能给我提供脚本和步骤吗,因为我是 Linux 的新手...

Linux:RHat、Ubuntu

谢谢

最佳答案

我将从这个启动脚本模板开始,将 SCRIPT_HOME 重命名为正确的路径,并在没有任何扩展名的情况下调用这个文件,然后在 SSH 中运行这个命令。

chkconfig –add javaserver

请注意 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

现在这里是 run.sh 脚本(这可以用来代替模板,但我发现将模板脚本变小更容易,并且与我的主脚本的链接不可更改,这样我就不必再碰它了。

下面的脚本是我发现的极少数实际上可以在不关闭当前运行的所有 java 程序的情况下重新启动 java 程序的脚本之一,这个脚本只针对它首先打开的程序,因此它永远不会犯任何错误,我从来没有失败过,在用户 root 上运行没问题。
也永远在后台运行您的程序(无需保持 SSH 打开)。

这是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

关于java - Java 应用程序的 Linux 启动脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7577620/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com