V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yangyuhan12138
V2EX  ›  Java

shell 脚本灵异事件 求大神帮忙分析一下

  •  
  •   yangyuhan12138 · 2020-04-17 13:03:20 +08:00 · 3106 次点击
    这是一个创建于 1471 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现有 springboot.sh 用来启动和停止应用的 如 /opt/8848/springboot.sh restart /opt/8848/dfepay-api-1.0.0.jar

    现在需要在启动应用时加参数 所以我为脚本加了一个参数 nohup java $3 -jar $SpringBoot > /dev/null 2>&1 &

    启动脚本就变为 /opt/8848/springboot.sh restart /opt/8848/dfepay-api-1.0.0.jar -Dxxxx

    这些都没问题 现在 我们要使用 skywalking 所以需要指定 javaagent
    神奇的事情发生了 只要最后一参数里包含 java stop 的时候就会出问题
    boot_id=ps -ef |grep java|grep $SpringBoot|grep -v grep|awk '{print $2}'

    chqtvl-ertwxt-a01:/opt/8848 # /opt/8848/springboot.sh restart /opt/8848/dfepay-api-1.0.0.jar jav ps -ef |grep java|grep /opt/8848/dfepay-api-1.0.0.jar|grep -v grep|awk '{print }'

    Stop /opt/8848/dfepay-api-1.0.0.jar, ^C chqtvl-ertwxt-a01:/opt/8848 # ^C chqtvl-ertwxt-a01:/opt/8848 # /opt/8848/springboot.sh restart /opt/8848/dfepay-api-1.0.0.jar java ps -ef |grep java|grep /opt/8848/dfepay-api-1.0.0.jar|grep -v grep|awk '{print }' 12873 12880 Stop /opt/8848/dfepay-api-1.0.0.jar,12873 12880 Terminated

    会找到两个不存在的进程 然后报错

    有没有大佬知道咋回事 第三个参数只要不包含 java 就没问题

    关键是 kill 的过程中跟第三个参数一点关系都没有呀 根本没使用到第三个参数 为啥会这样呢

    22 条回复    2020-04-18 16:13:03 +08:00
    ETiV
        1
    ETiV  
       2020-04-17 13:10:18 +08:00 via iPhone
    这个排版不大适合在手机上看…

    1. 你要调试 bash 吗?开头加一句 set -x
    2. 另外找进程可以用 pgrep…你找到的“不存在的进程”,一般都是 grep 自己。
    yangyuhan12138
        2
    yangyuhan12138  
    OP
       2020-04-17 13:27:13 +08:00
    @ETiV 做了排除的脚本里 现在问题可以简单描述为
    /bin/bash -x /opt/8848/springboot.sh stop /opt/8848/dfepay-api-1.0.0.jar java 有问题 如果第三个参数不加 或者传其他的都没问题 就是传 java 就会有问题
    yangyuhan12138
        3
    yangyuhan12138  
    OP
       2020-04-17 13:27:43 +08:00
    @ETiV 关键是 stop 里 根本没用到第三个参数 这就是最诡异的地方
    yangyuhan12138
        4
    yangyuhan12138  
    OP
       2020-04-17 13:39:46 +08:00
    @ETiV 我找到问题了 他自杀了 ... 如果第三个参数为 java 的话是满足他的 grep 的 所以他自己杀了自己
    ps -ef |grep java|grep $SpringBoot|grep -v grep|awk '{print $2}'
    但是如果第三个参数不包含 java 就没事 不满足这个 grep
    zydrsnuo
        5
    zydrsnuo  
       2020-04-17 13:48:32 +08:00
    你写的太乱了, 理不清楚.
    随便猜一下:
    boot_id=ps -ef |grep java|grep $SpringBoot|grep -v grep|awk '{print $2}' 这是 grep 既包含 java 又包含$SpringBoot 的意思.
    /bin/bash -x /opt/8848/springboot.sh stop /opt/8848/dfepay-api-1.0.0.jar 这里边估计是匹配到了$SpringBoot, 如果再加一个 java, 上一行那个 grep 就把这个进程匹配出来了.
    defunct9
        6
    defunct9  
       2020-04-17 13:53:00 +08:00
    你变强了,也更秃了
    yangyuhan12138
        7
    yangyuhan12138  
    OP
       2020-04-17 13:58:47 +08:00
    @zydrsnuo 对 就是这个原因 所以他自杀了
    yangyuhan12138
        8
    yangyuhan12138  
    OP
       2020-04-17 14:00:31 +08:00
    @zydrsnuo 中间那段比较乱的是 执行的效果 我想把那个执行流程粘出来 没想到 格式是这样....编辑的时候还好好的 我没有预览 不好意思 下次注意
    ybnsjl
        9
    ybnsjl  
       2020-04-17 16:20:33 +08:00
    8848 ?人机分离 10 米自动爆炸?
    yangyuhan12138
        10
    yangyuhan12138  
    OP
       2020-04-17 17:34:54 +08:00
    @ybnsjl 哈哈哈哈 当时故意搞的 黄金端口嗷
    james122333
        11
    james122333  
       2020-04-17 18:02:30 +08:00 via Android
    在这案例使用 ps 本来在 shell 中就不是个好方法
    你需要更飘逸的写法 而不是 ps 后面 grep 一堆
    以前也这样写过
    zsd6918
        12
    zsd6918  
       2020-04-17 18:13:39 +08:00
    建议把非动态的内容写在脚本里,多使用变量,你这样很容易出错
    阅读体验也不好
    yangyuhan12138
        13
    yangyuhan12138  
    OP
       2020-04-17 20:25:03 +08:00
    @zsd6918 但他确实是需要手动传的参数呀 每个项目的启动参数都不一样
    @james122333 比如呢
    james122333
        14
    james122333  
       2020-04-17 23:04:13 +08:00 via Android
    @yangyuhan12138
    没有比如 @@
    Foxkeh
        15
    Foxkeh  
       2020-04-17 23:19:42 +08:00
    注册成系统服务,管理简单
    zzl22100048
        16
    zzl22100048  
       2020-04-18 00:28:10 +08:00 via iPhone
    用 pm2 吧
    oneisall8955
        17
    oneisall8955  
       2020-04-18 01:02:08 +08:00 via Android
    systemd service 搞一下?
    ps1aniuge
        18
    ps1aniuge  
       2020-04-18 14:31:53 +08:00
    https://gitee.com/chuanjiao10/kasini3000/tree/master/node_script
    里面有个“jc 检测 [win-linux 进程命令行中] 关键字的并发数 z3.ps1” 可以做你的参考。
    maxbon
        19
    maxbon  
       2020-04-18 15:02:14 +08:00
    启动的时候指定 pid 他不香吗,ps+一堆的 grep 哪有直接指 pid 准确
    yangyuhan12138
        20
    yangyuhan12138  
    OP
       2020-04-18 15:55:01 +08:00
    @Foxkeh
    @oneisall8955
    正好问一下 做成系统服务了 没办法加 javaagent 了咋办 如 skywalking 那个 agent 的 jar 包会从相对目录里去找插件 但是做成系统服务之后他就找不到插件了
    yangyuhan12138
        21
    yangyuhan12138  
    OP
       2020-04-18 15:58:26 +08:00
    @ps1aniuge 看了一下 这是啥语法...看起来不像 shell 啊 能同时在 win 和 linux 上跑?
    ps1aniuge
        22
    ps1aniuge  
       2020-04-18 16:13:03 +08:00
    我思考了楼主类似的情况,重写了我的那个脚本,变成了“jc 检测 [win-linux 进程命令行中] 关键字的并发数 z4.ps1” ,会返回进程 id 数组。
    现正在抓紧时间调试,2----3 天后上传。敬请期待。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   948 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 22:40 · PVG 06:40 · LAX 15:40 · JFK 18:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.