shell 脚本灵异事件 求大神帮忙分析一下 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yangyuhan12138
V2EX    Java

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

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

    现有 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 吧
    itechify
        17
    itechify  
    PRO
       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     Solana     3990 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 05:25 PVG 13:25 LAX 21:25 JFK 00:25
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86