linux下shell脚本执行jar文件
最近在搞一个shell脚本启动jar文件个关闭jar文件的东东。搞得我都蛋疼了。今天晚上终于弄好了
话说,小弟的linux只是刚入门,经过各方查资料终于搞定了。话不多说,下面开始上小弟写的shell脚本
#!/bin/bash
#description: 启动重启server服务
#端口号,根据此端口号确定PID
PORT=
#启动命令所在目录
HOME='/usr/etc/server/java/server' #查询出监听了PORT端口TCP协议的程序
pid=`netstat -anp|grep $PORT|awk '{printf $7}'|cut -d/ -f1` start(){
if [ -n "$pid" ]; then
echo "server already start,pid:$pid"
return
fi
#进入命令所在目录
cd $HOME
nohup java -jar $HOME/pserver9997.jar > $HOME/server.log >& & #启动聊天服务器 把日志输出到HOME目录的server.log文件中
echo "start at port:$PORT"
} stop(){
if [ -z "$pid" ]; then
echo "not find program on port:$PORT"
return
fi
#结束程序,使用讯号2,如果不行可以尝试讯号9强制结束
kill - $pid
rm -rf $pid
echo "kill program use signal 2,pid:$pid"
}
status(){
if [ -z "$pid" ]; then
echo "not find program on port:$PORT"
else
echo "program is running,pid:$pid"
fi
} case $ in
start)
start
;;
stop)
stop
;;
restart)
$ stop
sleep
$ start
;;
status)
status
;;
*)
echo "Usage: {start|stop|status}"
;;
esac exit
上面是小弟写的shell脚本。写的不好请见谅。
首先遇到的第一个坑
我在window下写的 然后道linux中执行,在linux死活都说俺的19行有错误,俺就不明白了,哪里有错,问了下别人,也说没错。突然有个高人问我在哪编写的,小弟回答在win下,他告诉俺执行下这个命令:
dos2unix server.sh
然后小弟就执行了,说命令不存在,小弟只好安装这个,执行了以下命令
yum install dos2unix
等他执行完了 小弟在执行dos2unix server.sh
然后在执行.server.sh start ,
他居然奇迹的可以了。
小弟问了下是什么原因。人家高人,默默地回答了句,win下的换行跟linux下不一样。小弟才疏学浅,智能默默地求助度娘了。
让我找到了这个说法:
Linux和Windows和换行符不一样。Windows下是CRLF(\r\n或0d0a),Linux下是LF(\n或0a)。在Linux下有时会遇到从Windows过来的文本文件,这些文件带了Windows换行符,Linux下进行脚本处理时有可能会出一些莫名其妙的错误。因此需要将这些文件转换为Linux换行符。
然后人家这个高人用了别的方法。具体的链接可以看下 http://blog.chinaunix.net/uid-20726500-id-4492875.html
然后俺就欣喜若狂了,终于可以了。
然而当我执行stop方法有出现坑了。
根本没法执行,出现了如下的东东:

他居然说这个id没有找到,小弟当时无语了,难道是他没有找到要kill 的这个进程的id,有这个猜想,小弟果断执行了以下命令:

小弟,当时目瞪口呆了,这个命令执行出来是什么啊。kill命令一般是 kill -9(当然这个是强制杀死) pid啊 这个不是啊 应该是kill -9 1556,想到这 我应该获取的是1556这个pid,怎么获取呢。小弟又请出我们伟大的度娘了,搜索了一番,终于让我找到了这个命令:
netstat -anp|grep 9997|awk '{printf $7}'|cut -d/ -f1,截图如下

这个值,才是俺想要的嘛,果断改了下第7行的命令,改成了这个。小弟不才,直接用vim改的

然后wq保存,下面就是看下kill掉了吗?
然后执行 server.sh stop命令, 在控制台上输出了
看到这个,应该是kill掉了。
至此已经完成了。
那么这个获取pid命令,小弟还是不太懂 awk 是什么鬼?cut 倒是知道什么意思。
然后这时候又请出了神奇的度娘。多方打探、搜索,小弟搜到了这个
awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理,具体链接请看下面的
http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html
通过这个链接大体的也了解了
它上面有个这个解释
此外,$0变量是指整条记录。$1表示当前行的第一个域,$2表示当前行的第二个域,......以此类推
小弟有个这个 awk '{printf $7}'
那么这个$7是啥意思呢,就是取到得得1556/java这个值,不信,自己属下是不是第七个。
那么既然找到了这个那怎么取1556呢,如果是在java、php、js中很容易,但是在linux下呢,那么就需要cut命令了,cut顾名思义了,我也不多解释了,
具体用法,可以参考如下文章
http://www.cnblogs.com/dong008259/archive/2011/12/09/2282679.html
他有一个-d 是自定义分隔符的,那么就可以cut -d/
这个的意思是js中的split差不多意思
然后我再取第一个不就行了
总结起来就是 cut -d/ -f 1
就取到这个值了。
通过这个,小弟确实学了不少,也了解到小弟linux的水平了。
下一步就是添加到定时任务中。
当然就是crontab
安装crontab:
yum install crontabs
说明:
/sbin/service crond start //启动服务
/sbin/service crond stop //关闭服务
/sbin/service crond restart //重启服务
/sbin/service crond reload //重新载入配置
查看crontab服务状态:service crond status
手动启动crontab服务:service crond start
查看crontab服务是否已设置为开机启动,执行命令:ntsysv
加入开机自动启动:
chkconfig –level 35 crond on
1,crontab命令
功能说明:设置计时器。
语 法:crontab [-u <用户名称>][配置文件] 或 crontab [-u <用户名称>][-elr]
补充说明:cron是一个常驻服务,它提供计时器的功能,让用户在特定的时间得以执行预设的指令或程序。只要用户会编辑计时器的配置文件,就可以使 用计时器的功能。其配置文件格式如下:
Minute Hour Day Month DayOFWeek Command
参 数:
-e 编辑该用户的计时器设置。
-l 列出该用户的计时器设置。
-r 删除该用户的计时器设置。
-u<用户名称> 指定要设定计时器的用户名称。
2,crontab 格式
基本格式 :
* * * * * command
分 时 日 月 周 命令
第1列表示分钟1~59 每分钟用*或者 */1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列 表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令
# Use the hash sign to prefix a comment
# +—————- minute (0 – 59)
# | +————- hour (0 – 23)
# | | +———- day of month (1 – 31)
# | | | +——- month (1 – 12)
# | | | | +—- day of week (0 – 7) (Sunday=0 or 7)
# | | | | |
# * * * * * command to be executed
加入crontab中
0 22 * * * /root/sh/server.sh restart
好了就是这些东东了。有错误请指正
linux下shell脚本执行jar文件的更多相关文章
- linux下shell脚本启动jar包
本文采用的jar包是通过idea下maven打包的springboot项目. 写这个shell脚本是为了在linux下方便启动jar包时不用输入太多的shell命令,将启动脚本的一系列shell命令整 ...
- linux下shell脚本执行方法及exec和source命令
exec和source都属于bash内部命令(builtins commands),在bash下输入man exec或man source可以查看所有的内部命令信息. bash shell的命令分为两 ...
- Linux 下SHELL脚本自动同步文件
#!/bin/bash expect <<EOF set timeout spawn rsync -avz root@192.168.10.57:/var/www/html/manage_ ...
- linux 下shell脚本执行多个命令的方法
1.每个命令之间用;隔开说明:各命令的执行给果,不会影响其它命令的执行.换句话说,各个命令都会执行,但不保证每个命令都执行成功. 2.每个命令之间用&&隔开说明:若前面的命令执行成功, ...
- linux下shell脚本学习
在Linux系统中,虽然有各种各样的图形化接口工具,但是sell仍然是一个非常灵活的工具.Shell不仅仅是命令的收集,而且是一门非常棒的编程语言.您可以通过使用shell使大量的任务自动化,shel ...
- jemter分布式部署及linux下分布式脚本执行
jmeter进行接口性能测试,占用内存较大,在模拟千万计并发用户时,使用分布式部署进行分压测试. 操作步骤:选择一台机器作为调度机,其他机器作为执行机 一.jmeter分布式部署 前提条件:A.执行机 ...
- 浅析linux 下shell命令执行和守护进程
执行shell脚本有以下几种方式 1.相对路径方式,需先cd到脚本路径下 [root@banking tmp]# cd /tmp [root@banking tmp]# ./ceshi.sh 脚本执行 ...
- Linux学习 - shell脚本执行
一.shell概述 shell是一个命令行解释器,为用户提供一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用shell来启动.挂起.停止甚至是编写一些程序 shell还是一个功能强 ...
- Linux 下Shell 脚本几种基本命令替换区别
Shell 脚本几种基本命令替换区别 前言:因为工作需要,需要编写 shell script .编写大量 shell script 时,累计了大量经验,也让自己开始迷糊几种函数输出调用的区别.后面和 ...
随机推荐
- 在Mac下创建ASP.NET Core Web API
在Mac下创建ASP.NET Core Web API 这系列文章是参考了.NET Core文档和源码,可能有人要问,直接看官方的英文文档不就可以了吗,为什么还要写这些文章呢? 原因如下: 官方文档涉 ...
- 使用QUnit进行自动化单元测试
前言 前阵子由于项目需求接触了java的单元测试JUnit,就顺带着学习了前端的单元测试:Qunit. 既然跟测试有关,不妨介绍一下测试中的黑盒测试.白盒测试以及单元测试. 1.黑盒测试:所谓的黑盒, ...
- Python解析非标准JSON(Key值非字符串)
采集数据的时候经常碰到一些JSON数据的Key值不是字符串,这些数据在JavaScript的上下文中是可以解析的,但在Python中,没有该部分数据的上下文,无法采用json.loads(JSON)的 ...
- 7.4 数据注解属性--Required
Required attribute can be applied to a property of a domain class. EF Code-First will create a NOT N ...
- SQL常见的系统存储过程
1.sp_datebases 列出服务器上的所有数据库信息,包括数据库名称和数据库大小 例:exec sp_datebases 2.sp_helpdb 报告有关指定数据库或所有数据库的信息 例:exe ...
- Verilog学习笔记基本语法篇(十一)········ 常用系统函数
1)系统任务:$monitor 格式: $monitor(p1,p2,p3...pn); $monitor; $monitoron; $monitoroff; 任务$monitor提供了监控输出列 ...
- PHP7新增 功能
php7发布已有半月,最近有时间了解一下php7的新特性,当然,这个版本最大的特点是性能的提升.在下并非高手,欢迎大家指出错误,同时期待共同交流 1.在use语句增加了group支持use FooLi ...
- GJM : 游戏程序员的学习之路
原文作者:miloyip 原帖地址:http://gad.qq.com/article/detail/7180681 原帖备注:版权所有,禁止匿名转载:禁止商业使用:禁止个人使用. 腾讯前端技术总监 ...
- lua-resty-websocket安装和测试
作者:杨鑫奇 关注Openresty很久了,期待支持websocket终于出来了,看到Aapo Talvensaari同学写的文章https://medium.com/p/1778601c9e05,兴 ...
- 《C#微信开发系列(3)-获取接口调用凭据》
3.0获取接口调用凭据 ①接口说明 access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token.开发者需要进行妥善保存.access_token的存储至少要保留 ...