zoukankan      html  css  js  c++  java
  • linux下shell脚本执行jar文件

    最近在搞一个shell脚本启动jar文件个关闭jar文件的东东。搞得我都蛋疼了。今天晚上终于弄好了

    话说,小弟的linux只是刚入门,经过各方查资料终于搞定了。话不多说,下面开始上小弟写的shell脚本

    复制代码
     1 #!/bin/bash
     2 #description: 启动重启server服务 
     3 #端口号,根据此端口号确定PID  
     4 PORT=9997  
     5 #启动命令所在目录  
     6 HOME='/usr/etc/server/java/server'  
     7   
     8 #查询出监听了PORT端口TCP协议的程序  
     9 pid=`netstat -anp|grep $PORT|awk '{printf $7}'|cut -d/ -f1`  
    10   
    11   
    12 start(){  
    13    if [ -n "$pid" ]; then  
    14       echo "server already start,pid:$pid"  
    15       return 0
    16    fi
    17    #进入命令所在目录  
    18    cd $HOME  
    19    nohup java -jar $HOME/pserver9997.jar > $HOME/server.log 2>&1 &   #启动聊天服务器 把日志输出到HOME目录的server.log文件中   
    20    echo "start at port:$PORT"  
    21 }  
    22   
    23 stop(){  
    24    if [ -z "$pid" ]; then  
    25       echo "not find program on port:$PORT"  
    26       return 0
    27    fi
    28    #结束程序,使用讯号2,如果不行可以尝试讯号9强制结束  
    29    kill -9 $pid
    30    rm -rf $pid
    31    echo "kill program use signal 2,pid:$pid"  
    32 }  
    33 status(){  
    34    if [ -z "$pid" ]; then  
    35       echo "not find program on port:$PORT"  
    36    else  
    37       echo "program is running,pid:$pid"  
    38    fi  
    39 }  
    40   
    41 case $1 in  
    42    start)  
    43       start  
    44    ;;  
    45    stop)  
    46       stop  
    47    ;;
    48    restart)  
    49       $0 stop
    50       sleep 2
    51       $0 start
    52     ;;
    53    status)  
    54       status  
    55    ;;  
    56    *)  
    57       echo "Usage: {start|stop|status}"  
    58    ;;  
    59 esac  
    60   
    61 exit 0  
    复制代码

    上面是小弟写的shell脚本。写的不好请见谅。

    首先遇到的第一个坑

    我在window下写的 然后道linux中执行,在linux死活都说俺的19行有错误,俺就不明白了,哪里有错,问了下别人,也说没错。突然有个高人问我在哪编写的,小弟回答在win下,他告诉俺执行下这个命令:

    dos2unix server.sh

    然后小弟就执行了,说命令不存在,小弟只好安装这个,执行了以下命令

    yum install dos2unix

    等他执行完了 小弟在执行dos2unix server.sh
    然后在执行.server.sh start ,

    他居然奇迹的可以了。

    小弟问了下是什么原因。人家高人,默默地回答了句,win下的换行跟linux下不一样。小弟才疏学浅,智能默默地求助度娘了。

    让我找到了这个说法:

    Linux和Windows和换行符不一样。Windows下是CRLF( 或0d0a),Linux下是LF( 或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
    好了就是这些东东了。有错误请指正

  • 相关阅读:
    单例模式-Singlleton
    C#中静态与非静态方法比较
    关于orcale的数据库脚本,记录下来,方便自己以后用到查找
    关于Oracle和SQLServer数据库在.net中拼接数据库语句的不同
    Oracle数据类型与.NET中的对应关系
    Got a packet bigger than 'max_allowed_packet' bytes
    .NET、C#和ASP.NET三者之间的区别(转)
    The use specified as definer('root'@'%') does not exist的解决办法
    app.config .exe.config .vshost.exe.config配置
    python学习:(3)自动化表单提交
  • 原文地址:https://www.cnblogs.com/jpfss/p/10794081.html
Copyright © 2011-2022 走看看