linux - 为什么超时在 bash 脚本中不起作用?

标签 linux bash timeout

如果进程超过几秒,我会尝试终止它。

当我在终端中运行时,以下工作正常。

timeout 2 sleep 5

但是当我有一个脚本时——

#!/bin/bash
timeout 2 sleep 5

它说

timeout: command not found

为什么会这样?解决方法是什么?

--编辑--

在执行类型超时时,它说 -

timeout is a shell function

最佳答案

您的环境 $PATH 变量似乎不包含 /usr/bin/ 路径,或者 timeout 二进制文件可能存在于其他地方。

所以只需检查超时命令的路径:

command -v timeout

在你的脚本中使用绝对路径

例如

#!/bin/bash
/usr/bin/timeout 2 sleep 5

更新 1#

根据您的更新,它是在您的 shell 中创建的函数。如上例所述,您可以在脚本中使用绝对路径。

更新 2# timeout 命令从 coreutils 版本添加 => 8.12.197-032bb,如果 GNU 超时不可用,你可以使用 expect(Mac OS X,BSD,...不要默认情况下通常有 GNU 工具和实用程序)。

################################################################################
# Executes command with a timeout
# Params:
#   $1 timeout in seconds
#   $2 command
# Returns 1 if timed out 0 otherwise
timeout() {

    time=$1

    # start the command in a subshell to avoid problem with pipes
    # (spawn accepts one command)
    command="/bin/sh -c \"$2\""

    expect -c "set echo \"-noecho\"; set timeout $time; spawn -noecho $command; expect timeout { exit 1 } eof { exit 0 }"    

    if [ $? = 1 ] ; then
        echo "Timeout after ${time} seconds"
    fi

}

示例:

timeout 10 "ls ${HOME}"

Source

关于linux - 为什么超时在 bash 脚本中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22714787/

相关文章:

linux - 从 cat 加载变量到内存

bash - 如何通过 bash 脚本检测来自 ant/maven 的构建错误?

sql - 如何在数据库中导致超时异常?

asp.net - 即使在完成所有可能的设置后,使用 IIS 7 的 asp.net 2.0 中的超时和自动注销

c# - 如何在 Compact Framework 下的套接字上实现非无限接收和发送超时?

linux - gcc 在 SUSE Linux 上编译的程序不需要更新 ld.so.cache?

linux - 填充 Samba AD 反向区域

linux - 如何使用awk在前四个一个空格之后然后在两个空格等之后添加一个数字的空间

python - 如何使用正则表达式来匹配文件中其他小写单词不连续重复的大写单词

linux - bash date,在 n 小时后的特定时间戳上创建一个新对象