前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何在命令执行超时时自动终止该命令

如何在命令执行超时时自动终止该命令

作者头像
程序熵
发布2024-04-18 16:07:52
960
发布2024-04-18 16:07:52
举报
文章被收录于专栏:技术汇技术汇

问题

问题 《Command line command to auto-kill a command after a certain amount of time》 中的回答提出了一种从 bash 命令行中为长时间运行的命令设置超时的方法:

代码语言:javascript
复制
( /path/to/slow command with options ) & sleep 5 ; kill $!

但是有可能某个“耗时长”的命令会早于超时时间完成执行。(我们可以戏称这类命令为“通常耗时长但有时运行快”的命令,简称 tlrbsf。)

所以这个巧妙的一行式方法存在几个问题。 首先,sleep 不具备条件性,这意味着它设定了整个流程所需的最低时间下限。设想一下,如果 tlrbsf 命令在 2 秒内就完成了,但我们却设定了 30 秒、2 分钟甚至是 5 分钟的 sleep 时间——这是非常不可取的。

其次,kill 命令的执行是无条件的,因此当该流程试图杀死一个已停止运行的进程时,会导致错误提示或警告信息。

是否存在一种方法能够在满足以下条件的情况下对通常耗时长但有时运行快("tlrbsf")的命令设置超时:

  1. 使用 bash 实现(其他问题已有 Perl 和 C 的答案)
  2. 当出现以下两种情况之一时终止:tlrbsf 命令执行完毕,或者超时时间到达
  3. 不会尝试杀死不存在或已停止的进程(可选条件:在杀死失败时不产生错误信息)
  4. 不强制要求是一行命令
  5. 可在 Cygwin 或 Linux 环境下运行

另外,若能实现以下加分项更好:

  • 在前台运行 tlrbsf 命令
  • 避免额外的后台睡眠进程或多余进程

使得 tlrbsf 命令的标准输入/标准输出/标准错误可以被重定向,就像直接运行该命令一样?

如果是,请分享你的代码。如果不是,请解释原因。

我已经花费一段时间试图改进上述示例,但现在似乎触及到了我 bash 技能的极限。

回答

你大概是在寻找 coreutils 中的 timeout 命令。尽管它本质上是一个 C 语言解决方案,因为它属于 coreutils 工具集的一部分。

代码语言:javascript
复制
timeout 5 /path/to/slow/command with options

这个命令是用来限制某个命令运行的时间的,其中:

  • timeout: 这是一个 Linux 或类 Unix 系统自带的命令,用于限制其他命令的运行时间。
  • 5: 这个数值指定了超时时间,单位是秒。在这例子里,如果 /path/to/slow/command with options 这个命令在 5 秒钟之内没有结束运行,timeout 命令将会强制终止它。
  • /path/to/slow/command: 这是你要限制运行时间的命令的绝对路径,替换成实际的命令路径。
  • with options: 这部分是你想执行的具体命令的选项。

所以,整行命令的意思是:执行位于 /path/to/slow/command 位置的命令,并带上指定的选项,但如果该命令在 5 秒内未结束,就由 timeout 命令主动停止它。这样做的目的是防止命令无限制地运行,导致系统资源被长时间占用或其他问题。

笔者写了一个脚本 tlrbsf.sh 来充当提问者描述的 tlrbsf 命令,如下:

代码语言:javascript
复制
#! /usr/bin/bash

cnt=$(($RANDOM % 7 + 2))
echo "count is $cnt"
ping -c $cnt www.baidu.com

其中 cnt 使用随机数来计算得出就模拟了 tlrbsf 命令每次运行所需时间不可提前预知这一条件。

在多次测试中,耗时长(大于超时时间)的情况如下:

耗时短的情况如下:

参考:

  • stackoverflow question 687948
  • man timeout
  • man time
本文参与?腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2024-04-18,如有侵权请联系?cloudcommunity@tencent.com 删除

本文分享自 程序熵 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题
  • 回答
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com