yangyuhan12138
V2EX  ›  Java

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

  •  
  •   yangyuhan12138 · Apr 17, 2020 · 4155 views
    This topic created in 2234 days ago, the information mentioned may be changed or developed.

    现有 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 replies    2020-04-18 16:13:03 +08:00
    ETiV
        1
    ETiV  
       Apr 17, 2020 via iPhone
    这个排版不大适合在手机上看…

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