附Java/C/C++/机器学习/算法与数据结构/前端/安卓/Python/程序员必读书籍书单大全:

书单导航页(点击右侧 极客侠栈 即可打开个人博客):极客侠栈
①【Java】学习之路吐血整理技术书从入门到进阶最全50+本(珍藏版)
②【算法数据结构+acm】从入门到进阶吐血整理书单50+本(珍藏版)
③【数据库】从入门到进阶必读18本技术书籍网盘吐血整理网盘(珍藏版)
④【Web前端】从HTML到JS到AJAX到HTTP从框架到全栈帮你走更少弯路(珍藏版)   
⑤【python】书最全已整理好(从入门到进阶)(珍藏版)

⑥【机器学习】+python整理技术书(从入门到进阶已经整理好)(珍藏版)
⑦【C语言】推荐书籍从入门到进阶带你走上大牛之路(珍藏版)
⑧【安卓】入门到进阶推荐书籍整理pdf书单整理(珍藏版)

⑨【架构师】之路史诗级必读书单吐血整理四个维度系列80+本书(珍藏版)

⑩【C++】吐血整理推荐书单从入门到进阶成神之路100+本(珍藏)

【ios】IOS书单从入门到进阶吐血整理(珍藏版)

--------------------------------------------------------------------------------------------------------------------

通常对于服务来说,过长的命令往往让人感到厌烦,人们需要的只是简单的操作,并且能够支持复杂的功能,对于 Java 开发的服务来说更是如此。
一个比较复杂的 Jar 服务使用Java启动,命令如下

java -Xms512m -Xmx512m -jar fuck.jar --config config.server -port 10086

实际上许多虚拟机的语言的 Host 命令格式也是类似的。
我们分析可以知道对于基于虚拟机的语言,命令行基本上是 host+vm 运行参数+执行文件路径+输入参数。 当然如果参数较少,我们完全不用写一个 Launcher 脚本来管理服务。

Launcher 脚本需要提供的命令至少有:

  1. start
  2. stop
  3. restart
  4. status
  5. help

##实现 在 Linux 系统上,启动脚本应该是简单的,不许要过多依赖的,一般而言推荐使用 shell 脚本,实际上很多软件在 Linux 上的 Launcher 都是使用 Shell 语言。android studio,brackets Codebox ,甚至 Chrome,Firefox 都有 shell 脚本的启动器。
在 Windows 上早期,部分软件使用 cmd 来写启动器,然而 cmd 的功能孱弱,微软适时的推出了 PowerShell,PowerShell 在功能上非常强大,甚至要优于Shell,所以采用 PowerShell 来写启动器,并且写一个 cmd 辅助脚本启动PowerShell。

@echo offif not exist "%~dp0launcher.ps1" goto NotFound
PowerShell -NoProfile -NoLogo -ExecutionPolicy unrestricted -Command "[System.Threading.Thread]::CurrentThread.CurrentCulture = ''; [System.Threading.Thread]::CurrentThread.CurrentUICulture = '';& '%~dp0launcher.ps1' %*"
goto :EOF
:NotFound
echo Not Found launcher.ps1 in %~dp0,Please reset your launcher
PAUSE

###配置文件的读取 选择合适的配置文件能够简化操作,对于简单的 Shell 脚本而言,复杂的配置文件是难以实现的。我将 Launcher 的配置文件分为两类,一个是 JVM 的参数,也就是上面的 "-Xms512m -Xmx512m" 这种文件的格式就是按行读取,行首存在‘#’字符就抛弃。 另一类是基于 INI-Style 的配置文件,主要是 JDK 的路径,需要运行的 jar 包的路径,以及重定向的设置,由于 Windows 和 Linux 的文件系统存在差异,所以在涉及到文件系统的设置迁移到了 Windows 和 Posix 节

Bash 解析 Ini 文件:


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 解析 Ini 文件:

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
}

###JDK 的检测 查看 Java 路径,通常来说,launcher 脚本会从 launcher.cfg 读取Posix(Windows) 节的 JAVA_HOME 键值,如果没有 JAVA_HOME 的变量就读取环境变量的 JAVA_HOME,如果存在 JAVA_HOME,但实际路径上并不存在,或者没有存在 JAVA_HOME,那么再从查找 java的路径。而 JAVA_HOME 的设置可以在有多个JDK的时候仍然正确的选择 JDK.而不用带来冲突。

 jdkenv=$(GetPrivateProfileString launcher.cfg Posix JAVA_HOME)javabin=`which java`if [ -f "$jdkenv/bin/java" ]; thenjavabin="$jdkenv/bin/java"fi

Get-JavaSE 函数是为了支持从注册表查询 JDK 安装。所以单独的写了一个函数。


Function Get-JavaSE
{$jdk=$env:JAVA_HOME#This is regedit search javareturn $jdk
}$JdkRawEnv=$IniAttr["Windows"]["JAVA_HOME"]$JavaEnv="$env:JAVA_HOME"
IF($JdkRawEnv -eq $null)
{$JavaEnv=Get-JavaSE
}else{$JavaEnv=$JdkRawEnv
}

###进程的管理 先说 PowerShell,PowerShell 是面向对象的,我们可以轻松的获得进城对象。
我们使用 Start-Process 启动一个进程。在这个 cmdlet 中 我们添加 -PassThru 就可以得到一个进程对象

$ProcessObj= Start-Process -FilePath "${JavaExe}" -PassThru -Argumentlist "${VMOptions} -jar ${PrefixDir}\${AppPackage} $Parameters"  -RedirectStandardOutput "${StdoutFile}" -RedirectStandardError "${StdErrorFile}" -WindowStyle Hidden

$ProcessObj 可以拿到进程的 Id,进程的镜像名,以及进程的资源占用情况。 当然进程对象在 Get-Process 也是可用的。 使用 Get-Process 获得一个进程,如果有进程 id 再好不过。如果不存在 id 对应的进程则会抛出异常

  $Obj=Get-Process -Id $javaid

结束一个进程需要 Stop-Process 只需要输入 -Id id 即可。 而对于 Linux,有文件系统 /proc,同样可以实现 PowerShell 的功能。判断进程是否存在可以检测 /proc/id 是否存在,可以检查 /proc/id/status 查看资源占用什么的。
我们在 launcher 脚本所在目录(通常也是 jar 包所在目录)当启动 java 进程成功后,我们将 pid 写入到 launcher.lock.pid 在需要停止和重启的时候使用launcher.lock.pid 存储的 id 来操作即可。 在 PowerShell 中可以用 Get-Content 读取 pid。在 Linux 中可以用 cat。

启动
Windows

launcher -start

Linux

./launcher -start

重启

launcher -restart

停止服务

launcher -restart

查看状态:

launcher -status

帮助:

launcher -help

###最终 上述代码已经托管到 GIT@OSC
项目:http://git.oschina.net/ipvb/ServiceLauncher 使用MIT协议,欢迎 Pull Request.

多个平台的 Java Launcher 脚本相关推荐

  1. Groovy – Java的脚本语言

    Groovy – Java的脚本语言 by Mark Volkmann, Partner Object Computing, Inc. (OCI) 翻译:raxy 介绍 Groovy是用Java实现的 ...

  2. JAVA性能测试脚本分析

    众所周知, java 语言是一门非常适合网络开发的语言,用Java语言进行性能测试脚本开发将会大大提高测试开发效率.LoadRunner中提供了对Java虚拟用户的支持.Java虚拟用户依托于JDK, ...

  3. 让电脑死机的java代码_小编为你win7系统Java活动脚本出错导致电脑死机的还原方法...

    随着电脑的使用率越来越高,我们有时候可能会遇到win7系统Java活动脚本出错导致电脑死机问题,如果我们遇到了win7系统Java活动脚本出错导致电脑死机的问题,要怎么处理win7系统Java活动脚本 ...

  4. linux java平台,如何下载和安装用于 Linux 平台的 Java

    本文适用于: 平台: Red Hat Linux, SUSE Linux, Oracle Linux, Oracle Enterprise Linux, SLES Linux 系统要求 请参阅受支持的 ...

  5. linux自动安装Java环境脚本,Linux 自动添加JAVA环境脚本

    Linux 自动添加JAVA环境脚本 1. 删除原有的JAVA环境变量配置 ###  --------------delete old config --------------------  ### ...

  6. bat java 启动脚本_bat批处理启动java程序通用脚本

    前提: 脚本假设需要给脚本传递两个参数,参数最终传给java程序 脚本同级目录中classes内存放的是程序运行的classes文件 脚本同级目录中lib内存放的是程序运行的jar包 非最佳脚本,根据 ...

  7. java appium_Android应用开发之AS+Appium+Java+Win自动化测试之Appium的Java测试脚本封装(Android测试)...

    本文将带你了解Android应用开发AS+Appium+Java+Win自动化测试之Appium的Java测试脚本封装(Android测试),希望本文对大家学Android有所帮助. 一.为什么需要封 ...

  8. android第三方launcher,目前Android平台最好的Launcher

    由于Blackberry Priv无法Root,也无法刷其他的Room,因此可以折腾的也就只有Launcher了.其实Priv自带Launcher就已经很不错了,尤其是对于某些应用,上滑以预览的方式打 ...

  9. Java毕设项目线上教学平台(java+VUE+Mybatis+Maven+Mysql)

    Java毕设项目线上教学平台(java+VUE+Mybatis+Maven+Mysql) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webst ...

最新文章

  1. python可以做什么有趣的东西-Python 里itchat 模块能实现什么有趣的东西?
  2. 重磅发布|网易云信质量数据监控台对外开放
  3. Knowledge Review:超越知识蒸馏,Student上分新玩法!
  4. jquery 获取键值对中最大值_jquery属性的操作
  5. TextTopicNet:CMU开源无标注高精度自监督模型
  6. 通过Word 2016 发布的内容
  7. 解决问题 “You don‘t have permission to access /index.html on this server.”
  8. angularJS表达式详解!
  9. [bzoj 1855][SCOI2010]股票交易
  10. hdu 5823 color II 状压dp
  11. 【语音隐写】基于matlab GUI LSB语音信号数字水印【含Matlab源码 619期】
  12. HarmonyOS USB DDK助你轻松实现USB驱动开发
  13. arcgis for android 调用公网天地图注记重影问题
  14. 用户增长——AARRR模型
  15. 公司法人代表变更需要多少钱?
  16. 为什么HashMap的长度一定是2的次幂?
  17. java飞机游戏开发_java飞机小游戏制作
  18. 爬取豆瓣电影排行榜,并制作柱状图与3d柱状图
  19. 短时傅里叶变换原理及其MATLAB实现(Short Time Fourier Transform,STFT)
  20. VisionFive2 星光板,开发之旅-1

热门文章

  1. stm32f407+lwip+freertos程序附PCB图
  2. 【OA办公】OA流程审批大揭秘,带你看遍所有基础流程
  3. C++实验五 运算符重载
  4. 将execl文件拆分为多个excel文件
  5. 7款程序员实用工具,老少皆宜,你一定用得上
  6. 计算机毕业设计Node.js+Vue房地产销售系统(程序+源码+LW+部署)
  7. 3d模型 vv5_论SUV的自我修养,WEY VV5凭360度高清全景影像称霸同级!
  8. 15 Rest高级客户端实践(一):文档索引
  9. cesium自学记录(一)
  10. 【webots教程】简单的避障机器人