从子shell退出整个bash脚本

亚当·让·洛朗

我对bash脚本有点陌生,我有一个C ++程序通过一些命名管道与该bash脚本来回通信。我使用了inotifywait来监视文件夹中的新文件,并在添加新文件(以.job结尾)时通过管道将其发送到。

我正在用C ++程序将结果送回管道,如果结果是“退出”,则我希望bash脚本退出执行。

我试图通过出口1完成此操作,如下所示,但是这似乎并没有退出整个脚本。相反,在运行该出口之后,当我将另一个文件放入监视文件夹时,脚本结束。

我阅读了一些有关subshel​​l的信息,想知道这是否与它们有关,以及有关如何退出整个脚本的任何建议。

DROP_FOLDER="$1"
DATA_FOLDER="$2"
OUTPUT_FOLDER="$3"
PATH_TO_EXECS="./tmp/"
PATH_TO_COMPLETED="../completed/"

# create pipes
read_pipe=/tmp/c_to_bash
write_pipe=/tmp/bash_to_c

if [[ ! -p $read_pipe ]]; then
    mkfifo $read_pipe
fi

if [[ ! -p $write_pipe ]]; then
    mkfifo $write_pipe
fi

# start c++ program 
./tmp/v2 $DATA_FOLDER $OUTPUT_FOLDER $PATH_TO_EXECS "${write_pipe}" "${read_pipe}" &


# watch drop folder
inotifywait -m $DROP_FOLDER -e create -e moved_to |
    while read path action file; do
        # ends in .tga
        if [[ "$file" =~ .*tga$ ]]; then 

            # move to image dir
            mv "${DROP_FOLDER}${file}" "${DATA_FOLDER}${file}" 
        fi
        
        # ends in .job
        if [[ "$file" =~ .*job$ ]]; then
            # pipe to dispatcher 
            echo "${DROP_FOLDER}${file}" > $write_pipe

            # wait for result from pipe
            if read line <$read_pipe; then
                echo $line
                # check for quit result
                if [[ "$line" == 'quit' ]]; then
                    # move job file to completed
                    mv "${DROP_FOLDER}${file}" "${PATH_TO_COMPLETED}${file}"
                    # exit
                    exit 1
                fi

                # check for continue result
                if [[ "$line" == 'continue' ]]; then
                    # move job file to completed
                    mv "${DROP_FOLDER}${file}" "${PATH_TO_COMPLETED}${file}"
                fi
            fi
        fi
    done
用户名

通常,您可以kill "$$"从子外壳程序使用命令来终止主脚本($$即使在子外壳程序中,脚本也将扩展为主外壳程序的pid,并且可以设置TERM陷阱以捕获该信号)。

但看起来您实际上是想从右侧终止管道的左侧-即导致inotifywait终止而无需等待,直到它向孤立管道写入内容并被杀死SIGPIPE为此,您可以inotifywait使用pkill以下命令明确地终止进程

inotifywait -m /some/dir -e create,modify |
while read path action file; do
   pkill -PIPE -P "$$" -x inotifywait
done

pkill -P由父母选择;$$应该是脚本的PID。这种解决方案当然不是万无一失的。也看看这个

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Bash从子命令退出

来自分类Dev

从子shell脚本中的功能退出到父shell脚本

来自分类Dev

在bash中,退出脚本而不退出外壳,或者从子外壳中导出/设置变量

来自分类Dev

如果条件通过,请从mongo shell退出bash脚本

来自分类Dev

退出 bash shell 脚本后“docker run”死了

来自分类Dev

从子外壳退出外壳脚本

来自分类Dev

如果远程服务器上不存在文件或磁盘已满,则从子 shell 退出 shell 脚本?

来自分类Dev

退出shell脚本

来自分类Dev

不退出 shell 脚本

来自分类Dev

从使用$()的bash脚本退出

来自分类Dev

Bash Shell脚本:如何退出并重新启动脚本?

来自分类Dev

变量分配退出Shell脚本

来自分类Dev

在shell脚本中间退出sudo

来自分类Dev

变量赋值退出Shell脚本

来自分类Dev

退出整个脚本的正确方法是什么?

来自分类Dev

Bash脚本退出清理

来自分类Dev

bash脚本中的退出状态

来自分类Dev

Bash在脚本中退出sudo

来自分类Dev

无法正确退出bash脚本

来自分类Dev

bash shell-ssh远程脚本捕获输出和退出代码?

来自分类Dev

bash shell-ssh远程脚本捕获输出和退出代码?

来自分类Dev

通常,在shell脚本中,尤其是在Bash中,存在哪些退出模式?

来自分类Dev

在脚本中退出bash命令而不退出脚本

来自分类Dev

确保即使子脚本退出,父bash脚本也不会退出

来自分类Dev

在脚本中退出bash命令而不退出脚本

来自分类Dev

帮助bash或shell脚本

来自分类Dev

bash shell脚本错误

来自分类Dev

Bash Shell脚本:虽然apt-get update失败,但退出状态为0,利用退出状态编写自动更新脚本

来自分类Dev

Unix Shell脚本:退出并返回值