lihuoqingfly
V2EX  ›  问与答

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

  •  
  •   lihuoqingfly · Aug 10, 2014 · 7523 views
    This topic created in 4330 days ago, the information mentioned may be changed or developed.
    在linux或mac下,shell script 中要执行一个程序Foo(很耗时,且不是当前shell的子进程),需要Foo成功且自动关闭后再进行一些后续操作,该怎么实现?
    Supplement 1  ·  Aug 10, 2014
    多谢@aa65535 循环检测方法解决了我的问题,感谢各位!
    8 replies    2014-08-10 14:32:49 +08:00
    47jm9ozp
        1
    47jm9ozp  
       Aug 10, 2014
    Foo && Bar
    aa65535
        2
    aa65535  
       Aug 10, 2014
    Foo && {
    # do something
    }

    或者

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

    shell 中命令执行后是有退出码的,为零表示成功,非零表示失败。
    所以你要保证 Foo 不会再执行失败时返回 0 就行了。
    kfll
        3
    kfll  
       Aug 10, 2014
    set -e
    Foo
    # 失败退出,成功继续脚本
    lihuoqingfly
        4
    lihuoqingfly  
    OP
       Aug 10, 2014
    @ooxxcc
    @kfll
    @aa65535 试了各位的办法,程序Foo是GUI程序,一启动就返回结果$? == 0,是因为Foo是独立进程吗,而无法监听它是否关闭,所以后续命令还会先于Foo关闭时调用
    aa65535
        5
    aa65535  
       Aug 10, 2014
    @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  
       Aug 10, 2014
    @lihuoqingfly 你可以在shell进程中对前步逻辑进行监控,比如ps,或是checkpoint文件之类的,判断这些来做下一步的执行,不过都看需要了!
    47jm9ozp
        7
    47jm9ozp  
       Aug 10, 2014
    @lihuoqingfly 你是 open -a /Application/xxx.app 还是 /Applications/xxx.app/Contents/MacOS/xxx 这样运行的,要后面这个
    clino
        8
    clino  
       Aug 10, 2014 via Android
    sh -e
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3202 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 66ms · UTC 00:32 · PVG 08:32 · LAX 17:32 · JFK 20:32
    ♥ Do have faith in what you're doing.