Often, too long commands are annoying for services, and people need simple operations and support complex functions, especially for Java-developed services.
A more complex jar service starts with Java and commands the following
Java-xms512m-xmx512m-jar fuck.jar–config Config.server-port 10086
In fact, the host command format for many virtual machine languages is similar.
Our analysis can be known for virtual machine-based languages, the command line is basically HOST+VM run parameters + Execute file path + input parameters.
Of course, if there are fewer parameters, we don't have to write a launcher script to manage the service.
The commands that the launcher script needs to provide are at least:
1. Start
2. Stop
3. Restart
4. Status
5. Help
Realize
On Linux systems, startup scripts should be simple, not overly dependent, and in general, Shell scripting is recommended, in fact many of the software's launcher on Linux use the shell language. Android Studio,brackets Codebox, and even Chrome Firefox has a shell script launcher.
Early in Windows, some software used CMD to write the launcher, but the function of CMD is weak, Microsoft timely launched the Powershell,powershell is very powerful, even better than the shell, so the use of PowerShell to write the launcher, and write a CMD-assisted script to start PowerShell.
@echo offif not exist "%~dp0launcher.ps1" goto NotFoundPowerShell -NoProfile -NoLogo -ExecutionPolicy unrestricted -Command "[System.Threading.Thread]::CurrentThread.CurrentCulture = ‘‘; [System.Threading.Thread]::CurrentThread.CurrentUICulture = ‘‘;& ‘%~dp0launcher.ps1‘ %*"goto :EOF:NotFoundecho Not Found launcher.ps1 in %~dp0,Please reset your launcherPAUSE
Read the configuration file
Choosing the right profile simplifies the operation, and complex configuration files are difficult to implement for simple shell scripts. I launcher the configuration file into two categories, one is the JVM parameters, that is, the "-xms512m-xmx512m" above the format of the file is read by the line, the beginning of the existence of the ' # ' character is discarded.
The other is the Ini-style-based configuration file, mainly the path of the JDK, the path of the jar package that needs to be run, and the redirection settings, which are migrated to the Windows and POSIX sections due to the differences in the file systems of Windows and Linux.
Bash parsing INI file:
function GetPrivateProfileString(){if [ ! -f $1 ] || [ $# -ne 3 ];thenreturn 1fiblockname=$2fieldname=$3begin_block=0end_block=0cat $1 | while read linedoif [ "X$line" = "X[$blockname]" ];thenbegin_block=1continuefiif [ $begin_block -eq 1 ];thenend_block=$(echo $line | awk ‘BEGIN{ret=0} /^\[.*\]$/{ret=1} END{print ret}‘)if [ $end_block -eq 1 ];then#echo "end block"breakfineed_ignore=$(echo $line | awk ‘BEGIN{ret=0} /^#/{ret=1} /^$/{ret=1} END{print ret}‘)if [ $need_ignore -eq 1 ];then#echo "ignored line:" $linecontinuefifield=$(echo $line | awk -F= ‘{gsub(" |\t","",$1); print $1}‘)#####Fix Me We Support Space Valuevalue=$(echo $line | awk -F= ‘{gsub("","",$2); print $2}‘)#echo "‘$field‘:‘$value‘"if [ "X$fieldname" = "X$field" ];then#echo "result value:‘$result‘"echo $valuebreakfifidonereturn 0}
PowerShell parsing INI file:
Function Parser-IniFile{ param( [Parameter(Position=0,Mandatory=$True,HelpMessage="Enter Your Ini File Path")] [ValidateNotNullorEmpty()] [String]$File ) $ini = @{} $section = "NO_SECTION" $ini[$section] = @{} switch -regex -file $File { "^\[(.+)\]$" { $section = $matches[1].Trim() $ini[$section] = @{} } "^\s*([^#].+?)\s*=\s*(.*)" { $name,$value = $matches[1..2] # skip comments that start with semicolon: if (!($name.StartsWith(";"))) { $ini[$section][$name] = $value.Trim() } } } $ini}
Detection of JDK
Looking at the Java path, typically, the launcher script reads the Java_home key value of the POSIX (Windows) section from Launcher.cfg, if there is no java_home variable to read the java_home of the environment variable, if there is a Java _home, but the actual path does not exist, or there is no java_home, then the path from the lookup java. The Java_home setting can still choose the JDK correctly when there are multiple jdk. Without conflict.
jdkenv=$(GetPrivateProfileString launcher.cfg Posix JAVA_HOME)javabin=`which java`if [ -f "$jdkenv/bin/java" ]; thenjavabin="$jdkenv/bin/java"fi
The Get-javase function is designed to support querying JDK installations from the registry. So I wrote a function separately.
Function Get-JavaSE{ $jdk=$env:JAVA_HOME #This is regedit search java return $jdk}$JdkRawEnv=$IniAttr["Windows"]["JAVA_HOME"]$JavaEnv="$env:JAVA_HOME"IF($JdkRawEnv -eq $null){ $JavaEnv=Get-JavaSE}else{ $JavaEnv=$JdkRawEnv}
Management of processes
First say Powershell,powershell is object-oriented, we can easily get into the object of the city.
We use start-process to start a process. In this cmdlet we add-passthru to get a process object
$ProcessObj= Start-Process -FilePath "${JavaExe}" -PassThru -Argumentlist "${VMOptions} -jar ${PrefixDir}\${AppPackage} $Parameters" -RedirectStandardOutput "${StdoutFile}" -RedirectStandardError "${StdErrorFile}" -WindowStyle Hidden
$PROCESSOBJ can get the ID of the process, the mirror name of the process, and the resource usage of the process.
Of course, process objects are also available in get-process.
Use Get-process to get a process that is better if you have a process ID. Throws an exception if no process with ID exists
$Obj=Get-Process -Id $javaid
To end a process requires stop-process just enter the-id Id.
For Linux, there are file system/proc, also can realize the function of PowerShell. Determine if the process exists to detect whether/PROC/ID exists, and you can check/proc/id/status to see what the resource occupies.
We are in the directory where the launcher script is located (usually the directory where the jar package is located) when the Java process starts successfully, we write the PID to Launcher.lock.pid to use the ID of the Launcher.lock.pid store when it needs to be stopped and restarted.
The PID can be read with get-content in PowerShell. In Linux, you can use cat.
Eventually
The above code has been managed to [email protected]
Project: Servicelauncher Use the MIT protocol to welcome pull Request.
Java Launcher scripts for multiple platforms