相关疑难解决方法(0)

如何阻止信号杀死我的 Bash 脚本?

我想要一个无限循环继续运行,并且只被一个终止信号暂时中断。我试过 SIGINT、SIGUSR1、SIGUSR2。他们似乎都停止了循环。我什至尝试过 SIGINFO,但 Linux 不支持。

#!/bin/bash
echo $$ > /tmp/pid  # Save the pid

function do_something {
    echo "I am doing stuff" #let's do this now, and go back to doing the thing that is to be done over and over again.
#exit
}


while :
do
    echo "This should be done over and over again, but always wait for someething else to be done in between"

    trap do_something SIGINT
    while `true`
    do
            sleep 1 #so we're waiting for that …
Run Code Online (Sandbox Code Playgroud)

bash signals kill

6
推荐指数
1
解决办法
5094
查看次数

ERR 背后的实际信号是什么

我在几个地方(包括 SO)读过-e被认为是“糟糕的形式”并且在出现任何错误时退出脚本是不可靠的。处理错误的更好方法似乎是使用trap,例如:

trap "echo there was an error; exit 1;" ERR
Run Code Online (Sandbox Code Playgroud)

我似乎无法在手册页中找到ERR实际信号是什么?我假设它是,SIGQUIT但我无法确定。

man 7 signal
Run Code Online (Sandbox Code Playgroud)

只有您期望的正常信号SIGTERM SIGQUIT SIGINT等。

man trap
Run Code Online (Sandbox Code Playgroud)

有对ERR信号的引用,但似乎没有定义它。

例如:“ A trap on ERR, if set, is executed before the shell exits.

man bash
Run Code Online (Sandbox Code Playgroud)

类似于man trapin that is 引用ERR但没有根据我所看到的来定义它。

捷径背后的实际信号是什么ERR?(在正常信号中,如 中所示man 7 signal)。

我更喜欢捕获实际的信号名称而不是速记版本,尽管我意识到它们会产生相同的结果(从脚本中的命令捕获任何错误,然后抛出到处理程序)。

linux error-handling bash signals bash-trap

3
推荐指数
1
解决办法
1942
查看次数

Bash:退出并清除错误

在我的Bash脚本中,我想确保一旦出现错误就退出脚本.(例如,为了避免rm -f *在失败后出错cd some_directory.)因此,我总是使用-ebash 的标志.

现在,我想喜欢我的一些脚本来执行一些清理代码.从这篇博文中我收集到了

#!/bin/bash

cd invalid_directory
echo ':('

function clean_up {
  echo "> clean_up"
  exit 0
}
trap clean_up EXIT
Run Code Online (Sandbox Code Playgroud)

我得到的输出是

./test.sh: line 3: cd: invalid_directory: No such file or directory
:(
> clean_up
Run Code Online (Sandbox Code Playgroud)

所以它做了广告宣传.但是,当-e用于bash时,我只会得到

./test.sh: line 3: cd: invalid_directory: No such file or directory
Run Code Online (Sandbox Code Playgroud)

所以脚本退出而不调用clean_up.

如何在所有错误中退出bash脚本每次调用清理脚本?

error-handling bash

2
推荐指数
1
解决办法
4263
查看次数

在 shell 脚本中执行时 Docker Kill 不起作用

在终端中手动逐行运行命令时,以下工作正常:

docker create -it --name test path
docker start test
docker exec test /bin/sh -c "go test ./..."
docker stop test
docker rm -test
Run Code Online (Sandbox Code Playgroud)

但是当我将其作为 shell 脚本运行时,Docker 容器既没有停止也没有删除。

#!/usr/bin/env bash
set -e

docker create -it --name test path
docker start test
docker exec test /bin/sh -c "go test ./..."
docker stop test
docker rm -test
Run Code Online (Sandbox Code Playgroud)

我怎样才能让它在 shell 脚本中工作?

bash shell docker

0
推荐指数
1
解决办法
1002
查看次数

标签 统计

bash ×4

error-handling ×2

signals ×2

bash-trap ×1

docker ×1

kill ×1

linux ×1

shell ×1