Linux shell 杀死命令,同时仍然根据输出运行

标签 linux parsing shell output terminate

我在 Code::Blocks 中有一组 C++ 项目以及一个构建所有这些项目的脚本。该脚本如下所示:

codeblocks --build --target="release32" project1.cbp
codeblocks --build --target="release32" project2.cbp
codeblocks --build --target="release32" project3.cbp
...

有时,在构建其中一个项目时,Code::Blocks 无法完成该过程并出现错误:*** glibc 检测到 *** codeblocks: 损坏的双链表。这与构建失败无关,这只是代码块中的一个错误,请参见此处: https://bugs.launchpad.net/ubuntu/+source/codeblocks/+bug/764728 或在这里: http://forums.codeblocks.org/index.php?topic=16883.0

我想要做的一个解决方法是在命令仍在运行时解析命令的输出,找到字符串“codeblocks:损坏的双链表”,然后终止代码块以让脚本构建其他项目并完成。

我怎样才能做到这一点?

最佳答案

有点 hacky,但这对你有用吗(bash)?

这只是为了模拟代码块二进制文件(./codeblocks):

$ cat codeblocks
#!/bin/bash

num=$RANDOM
((num %= 2))

case "$num" in
        0)
                echo "codeblocks finished successfully: $*"
                exit 0
                ;;
        1)
                echo "*** glibc detected *** codeblocks: corrupted double-linked list" 1>&2
                while true; do
                        sleep 1
                done
                ;;
esac

这是实际的测试脚本(test.sh):

$ cat test.sh
#!/bin/bash

run_codeblocks()
{
        until (
                subshell_pid=$BASHPID
                echo "trying to run 'codeblocks $*'"
                ./codeblocks "$@" 2>&1 | while read line; do
                        echo "[${line}]"
                        [[ ${line} == *"*** glibc detected ***"* ]] && kill $subshell_pid
                done
                return 0
        ); do
                :
        done
}

echo "running codeblocks ..."
run_codeblocks 1
run_codeblocks 2
run_codeblocks 3
echo "... done"

您将对 codeblocks 的调用包装在子 shell 中,grep 其输出,如果一行与您指定的错误匹配,则会终止该子 shell。基本上就是你所描述的。

$ ./test.sh
running codeblocks ...
trying to run 'codeblocks 1'
[codeblocks finished successfully: 1]
trying to run 'codeblocks 2'
[*** glibc detected *** codeblocks: corrupted double-linked list]
./test.sh: line 4: 29889 Terminated              ( subshell_pid=$BASHPID; echo "trying to run 'codeblocks $*'"; ./codeblocks "$@" 2>&1 | while read line; do
    echo "[${line}]"; [[ ${line} == *"*** glibc detected ***"* ]] && kill $subshell_pid; return 0;
done )
trying to run 'codeblocks 2'
[*** glibc detected *** codeblocks: corrupted double-linked list]
./test.sh: line 4: 29892 Terminated              ( subshell_pid=$BASHPID; echo "trying to run 'codeblocks $*'"; ./codeblocks "$@" 2>&1 | while read line; do
    echo "[${line}]"; [[ ${line} == *"*** glibc detected ***"* ]] && kill $subshell_pid; return 0;
done )
trying to run 'codeblocks 2'
[codeblocks finished successfully: 2]
trying to run 'codeblocks 3'
[*** glibc detected *** codeblocks: corrupted double-linked list]
./test.sh: line 4: 29903 Terminated              ( subshell_pid=$BASHPID; echo "trying to run 'codeblocks $*'"; ./codeblocks "$@" 2>&1 | while read line; do
    echo "[${line}]"; [[ ${line} == *"*** glibc detected ***"* ]] && kill $subshell_pid; return 0;
done )
trying to run 'codeblocks 3'
[codeblocks finished successfully: 3]
... done

关于Linux shell 杀死命令,同时仍然根据输出运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15922315/

相关文章:

c - 使用 zlib 将 GZIP 压缩到缓冲区

linux - Ubuntu 14.04 上的 fstab 问题

Python - 打开新的 shell 并运行命令

linux - Shell 脚本检查字符串是否包含两个输入参数

linux - 无法删除文件 - 终端将文件名分成两个

linux - 替换 sed 中的控制字符

json - 使用 Codable swift 解析时忽略数组中的空对象

Android:解析网络服务响应并存储在局部变量中

perl - 解析文本时是否有一个好的 CPAN 模块来实现状态机?

shell - 需要查看24小时内哪些文件已更改并发送电子邮件(Shell脚本)