V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
lihuoqingfly
V2EX  ›  问与答

Shell script 启动一个程序,如何实现程序运行成功且关闭时执行后续命令?

  •  
  •   lihuoqingfly · 2014-08-10 02:17:45 +08:00 · 6975 次点击
    这是一个创建于 3760 天前的主题,其中的信息可能已经有所发展或是发生改变。
    在linux或mac下,shell script 中要执行一个程序Foo(很耗时,且不是当前shell的子进程),需要Foo成功且自动关闭后再进行一些后续操作,该怎么实现?
    第 1 条附言  ·  2014-08-10 13:30:14 +08:00
    多谢@aa65535 循环检测方法解决了我的问题,感谢各位!
    8 条回复    2014-08-10 14:32:49 +08:00
    ooxxcc
        1
    ooxxcc  
       2014-08-10 02:47:39 +08:00
    Foo && Bar
    aa65535
        2
    aa65535  
       2014-08-10 02:53:10 +08:00
    Foo && {
    # do something
    }

    或者

    Foo
    RETVAL="$?"
    [ $RETVAL != 0 ] && exit 1
    # do something

    shell 中命令执行后是有退出码的,为零表示成功,非零表示失败。
    所以你要保证 Foo 不会再执行失败时返回 0 就行了。
    kfll
        3
    kfll  
       2014-08-10 09:18:26 +08:00
    set -e
    Foo
    # 失败退出,成功继续脚本
    lihuoqingfly
        4
    lihuoqingfly  
    OP
       2014-08-10 10:00:45 +08:00
    @ooxxcc
    @kfll
    @aa65535 试了各位的办法,程序Foo是GUI程序,一启动就返回结果$? == 0,是因为Foo是独立进程吗,而无法监听它是否关闭,所以后续命令还会先于Foo关闭时调用
    aa65535
        5
    aa65535  
       2014-08-10 11:49:21 +08:00
    @lihuoqingfly 那这样的话只能循环检测程序是否退出了
    # 下面的 test.sh 是你shell 脚本的名称
    Foo
    while true; do
      ps -ef | grep -v grep | grep -v "test.sh" | grep Foo || break
      sleep 5
    done
    # do something
    gavingeng
        6
    gavingeng  
       2014-08-10 12:14:22 +08:00
    @lihuoqingfly 你可以在shell进程中对前步逻辑进行监控,比如ps,或是checkpoint文件之类的,判断这些来做下一步的执行,不过都看需要了!
    ooxxcc
        7
    ooxxcc  
       2014-08-10 12:29:20 +08:00
    @lihuoqingfly 你是 open -a /Application/xxx.app 还是 /Applications/xxx.app/Contents/MacOS/xxx 这样运行的,要后面这个
    clino
        8
    clino  
       2014-08-10 14:32:49 +08:00 via Android
    sh -e
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   882 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 21:47 · PVG 05:47 · LAX 13:47 · JFK 16:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.