V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
fangcan
V2EX  ›  Linux

Linux 命令 grep, awk 执行疑惑

  •  
  •   fangcan · 2020-07-08 16:26:09 +08:00 · 3161 次点击
    这是一个创建于 1600 天前的主题,其中的信息可能已经有所发展或是发生改变。
    脚本如下:检测 tomcat 是否启动,如果启动则停掉 tomcat
    pid=`ps -ef|grep tomcat |grep -v grep |awk '{printf $2}'`
    echo "pppp:${pid}"
    if [ "$pid" != "" ] ; then
    echo "shutdown tomcat ..."
    ... 后面省略

    背景:tomcat 没有启动

    步骤如下:
    1. 单独拿 ps -ef|grep tomcat |grep -v grep |awk '{printf $2}' 执行返回空
    2. 执行脚本 pid 却能打印出进程号

    求大佬们看下 为什么 pid 能打印出进程号?
    20 条回复    2020-07-08 20:14:01 +08:00
    dingwen07
        1
    dingwen07  
       2020-07-08 16:29:14 +08:00   ❤️ 1
    开调试模式看看到底执行了什么
    goofool
        2
    goofool  
       2020-07-08 16:31:03 +08:00 via Android   ❤️ 1
    你的脚本名字叫 tomcatxxx 吧
    neighbads
        3
    neighbads  
       2020-07-08 16:32:56 +08:00   ❤️ 1
    tomcat 过滤一般选 java 吧,进程名不一定带 tomcat,所以直接执行返回空。

    执行脚本返回 pid 是因为 你的脚本名字是 带 tomcat 的?
    senninha
        4
    senninha  
       2020-07-08 16:33:22 +08:00   ❤️ 1
    脚本名是不是包含关键字 tomcat ?直接脚本里输出一下这个命中的进程 id 是属于哪个进程的就好了。
    singerll
        5
    singerll  
       2020-07-08 16:33:44 +08:00 via Android
    2 楼让我想起了上次有兄弟在这问,为何总有个 grep 进程每次都不一样还杀不掉。
    fangcan
        6
    fangcan  
    OP
       2020-07-08 16:41:24 +08:00
    @goofool
    @senninha
    脚本名确实包含 tomcat , 为什么有包含就不行?
    kiwi95
        7
    kiwi95  
       2020-07-08 16:42:01 +08:00 via iPhone   ❤️ 1
    找进程用 pgrep 不要用 grep
    fangcan
        8
    fangcan  
    OP
       2020-07-08 16:43:48 +08:00
    @goofool
    @senninha
    好像明白了 ..
    kiwi95
        9
    kiwi95  
       2020-07-08 16:43:51 +08:00 via iPhone
    @fangcan 脚本在执行本身也是进程
    fangcan
        10
    fangcan  
    OP
       2020-07-08 16:46:20 +08:00
    感谢各位大佬解答
    fangcan
        11
    fangcan  
    OP
       2020-07-08 16:51:54 +08:00
    @kiwi95 嗯,搞清楚了 感谢
    lxk11153
        12
    lxk11153  
       2020-07-08 17:41:54 +08:00
    @fangcan #6
    1. 你自己执行的 命令 /脚本 所产生的进程也会进 ps 的输出的啊,你比如`ps -ef --forest|less -S`
    \_ bash
    __ \_ ps -ef --forest
    __ \_ less -S
    假设你脚本叫 tomcat.sh ,你运行后,进程里肯定有`bash tomcat.sh`这一条, 所以你脚本里`ps -ef|grep tomcat`就会出来`bash`这个进程。应该加上一些其它关键字来进一步筛选进程,你比如说
    `telnet v2ex.com 80` `telnet v2ex.com 443` 搜 443 就不能用`grep telnet`来筛选了

    2. 2020 年了,找进程`grep tomcat |grep -v grep`太不优雅了,请用 pgrep/pkill
    lululau
        13
    lululau  
       2020-07-08 17:46:11 +08:00
    用 systemd, supervisor 之类的管理,不要重复造轮子
    lxk11153
        14
    lxk11153  
       2020-07-08 18:26:31 +08:00
    @lululau #13 systemd 在 macos 里 对应哪个系统命令?
    Superheroes
        15
    Superheroes  
       2020-07-08 18:40:49 +08:00
    jps |grep Bootstrap |awk '{printf $1}'
    no1xsyzy
        16
    no1xsyzy  
       2020-07-08 19:07:22 +08:00
    @lxk11153 #14 systemd 不是系统命令,是自己去写 unit,然后用 systemctl 处理。
    对应 macos 需要自己写 plist 文件,具体放哪我不记得了……
    cattyhouse
        17
    cattyhouse  
       2020-07-08 19:12:25 +08:00
    改一下:

    pid=`ps -ef|grep -w tomcat |grep -v grep |awk '{printf $2}'`

    '-w' 是说匹配整个关键字
    cattyhouse
        18
    cattyhouse  
       2020-07-08 19:15:15 +08:00
    还有你可以用 pid=$(pgrep -x tomcat)

    '-x' Only match processes whose names (or command line if -f is specified) exactly match the pattern.
    lululau
        19
    lululau  
       2020-07-08 19:54:05 +08:00 via iPhone
    @lxk11153 launchd,前端命令是 launchctl
    yangbonis
        20
    yangbonis  
       2020-07-08 20:14:01 +08:00 via iPhone
    pidof,ps -C,cmdline 的二进制名和 comm 都不唯一的话,就让 systemd 管理吧。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   945 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 19:35 · PVG 03:35 · LAX 11:35 · JFK 14:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.