如果进程超过几秒,我会尝试终止它。
当我在终端中运行时,以下工作正常。
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}"
关于linux - 为什么超时在 bash 脚本中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22714787/