【问题标题】:Detect end of process from a sub-shell in ksh从 ksh 中的子 shell 检测进程结束
【发布时间】:2014-05-23 23:03:19
【问题描述】:

我启动一个主脚本:master.ksh

我想在master.ksh工作期间做一些后台任务。 为此,我在 master.ksh 的开头创建了一个脚本:slave.ksh 和 $

./slave.ksh &

这里是slave.ksh的代码:

#!/bin/ksh

touch tmpfile
export thepid=$!
while [[`if [ -n "$thepid" ];fi`]]; do
    pwd >> tmpfile
    #other set of commands ...
    export thepid=$!
done

thepid用来监控master.ksh的pid,当master.ksh结束时,我希望slave.ksh也结束,所以slave.ksh也退出

但我从 slave.ksh 收到一个错误:

syntax error at line 5; fi unexpected

如果我删除 fi ,我会收到另一个错误。测试 $thepid 的好方法是什么?

【问题讨论】:

    标签: if-statement while-loop ksh pid


    【解决方案1】:

    ...

    我不知道从哪里开始。这至少在三个方面被破坏:shell 变量不能那样工作,if 语句不能那样工作,条件语句不能那样工作。

    这是一种方法(在 93u+ 上测试):

    > cat master.ksh
    #!/bin/ksh -eu
    
    print master says hi
    
    ./slave.ksh&
    sleep 5
    
    print master says bye
    > cat slave.ksh
    #!/bin/ksh -eu
    
    print slave says hi
    
    while (($(ps oppid= $$)==$PPID))
    do
        # work
        print slave working....
        sleep 1
    done
    
    print slave says bye
    > ./master.ksh
    master says hi
    slave says hi
    slave working....
    slave working....
    slave working....
    slave working....
    slave working....
    master says bye
    > slave says bye
    

    这会将PPID shell 变量(似乎在进程启动时设置)与 linux ps 工具返回的父进程 ID 进行比较,该工具返回真实的当前值。这是因为当一个进程死亡时,它所拥有的任何子进程都将其父进程更改为1 (init)。所以slave只要它原来的PPID和它当前的PPID匹配就可以工作,然后就退出了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-31
      • 2016-08-04
      • 2014-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多