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

问题

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

( /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 工具集的一部分。

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 命令,如下:

#! /usr/bin/bashcnt=$(($RANDOM % 7 + 2))
echo "count is $cnt"
ping -c $cnt www.baidu.com

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

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

在这里插入图片描述

耗时短的情况如下:

在这里插入图片描述


参考:

  • stackoverflow question 687948
  • man timeout
  • man time

相关阅读:

  • 2>&1是什么意思
  • 如何用命令行将文本每两行合并为一行?
  • 如何改变echo在Linux下的输出颜色
  • 为什么要使用xargs命令
  • Bash中 $! $* $@ 等各种符号的含义
  • 在shell程序里如何从文件中获取第n行

如有疑问或者其他 Bash Shell 相关问题,欢迎在文末留言,你的独特视角,或许就是他人求解谜团的钥匙。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/147212.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

python绘制弦图-科研作图

一、背景 弦图以其直观、精美的展示方式受到越来越多人的关注,它不仅能够有效展示两个变量之间的联系,还能同时展现多个变量间的复杂互动,本文将通过Python语言中的pycirclize库,带你深入了解如何绘制弦图。 弦图是一种圆…

CQRS模型解析

简介 CQRS中文意思为命令于查询职责分离,我们可以将其了解成读写分离的思想。分为两个部分 业务侧和数据侧,业务侧主要执行的就是数据的写操作,而数据侧主要执行的就是数据的读操作。当然两侧的数据库可以是不同的。目前最为常用的CQRS思想方…

强大的重命名工具 | Bulk Rename Utility v4.0 便携版

软件简介 Bulk Rename Utility是一款功能强大且易于使用的文件批量重命名工具。它不仅体积小巧,而且完全免费,提供了友好的用户界面。该软件允许用户对文件或文件夹进行批量重命名,支持递归操作,即包含子文件夹的重命名。 软件特…

镜像导入、标签设置与应用、探针测试

一、镜像导入 1、master主机下载镜像并打包 [rootk8s-master ~]# docker pull nginx:1.20.0[rootk8s-master ~]# docker pull nginx:1.21.0[rootk8s-master ~]# docker pull nginx:1.25.0[rootk8s-master ~]# docker pull busybox:latest[rootk8s-master ~]# docker save -o n…

FreeRTOS下UART的封装

FreeRTOS下UART的封装_哔哩哔哩_bilibili Git使用的一个BUG: 当出现这个问题是因为git本身的安全证书路径有问题,我们需要重新指定路径 P1:UART程序层次

蓝桥杯嵌入式的学习总结

一. 前言 嵌入式竞赛实训平台(CT117E-M4) 是北京国信长天科技有限公司设计,生产的一款 “ 蓝桥杯全国软件与信息技术专业人才大赛-嵌入式设计与开发科目 “ 专用竞赛平台,平台以STM32G431RBT6为主控芯片,预留扩展板接口,可为用户提…

正点原子RK3588(二)——lenet测试和modelzoo模型

文章目录 一、lenet二、modelzoo模型2.1 介绍2.2 测试 一、lenet import cv2 import numpy as np from rknnlite.api import RKNNLite RKNN_MODEL LeNet5_mnist_model.rknndef show_top5(result):output result[0].reshape(-1)output_sorted sorted(output, reverseTrue)to…

AI资深导师指导-ChatGPT深度科研工作应用、论文撰写、数据分析及机器学习与AI绘图

2022年11月30日,可能将成为一个改变人类历史的日子——美国人工智能开发机构OpenAI推出了聊天机器人ChatGPT3.5,将人工智能的发展推向了一个新的高度。2023年4月,更强版本的ChatGPT4.0上线,文本、语音、图像等多模态交互方式使其在…

Fyne ( go跨平台GUI )中文文档-绘图和动画(三)

本文档注意参考官网(developer.fyne.io/) 编写, 只保留基本用法 go代码展示为Go 1.16 及更高版本, ide为goland2021.2 这是一个系列文章: Fyne ( go跨平台GUI )中文文档-入门(一)-CSDN博客 Fyne ( go跨平台GUI )中文文档-Fyne总览(二)-CSDN博客 Fyne ( go跨平台GUI…

GAMES101(15节,辐射,BRDF)

Irradiance辐射度量学 辐射度量学在渲染领域,可以帮助理解基于物理的光照模型 radiant energy辐射能量Q,累计总能量(单位J joule焦耳),就像太阳能板,光照时间越长接收能量越多,收到的能量总和…

python是什么语言写的

Python是一种计算机程序设计语言。是一种面向对象的动态类型语言。现今Python语言很火,可有人提问,这么火的语言它的底层又是什么语言编写的呢? python是C语言编写的,它有很多包也是用C语言写的。 所以说,C语言还是很…

解密的军事卫星图像在各种民用地理空间研究中都有应用

一、美军光学侦察卫星计划概述 国家侦察局 (NRO) 负责开发和操作太空侦察系统,并为美国国家安全开展情报相关活动。NRO 开发了几代机密锁眼 (KH) 军事光学侦察卫星,这些卫星一直是美国国防部 (D…

Upload-Labs 文件上传靶场 通关

Pass-01 (本pass在客户端使用js对不合法图片进行检查!) Pass-02 Pass-02 (本pass在服务端对数据包的MIME进行检查!) Pass-03 Pass-03 (本pass禁止上传.asp|.aspx|.php|.jsp后缀文件!) AddType application/x-httpd-php .php .phtml .php3 .php4 .p…

Java-Part 0

Advanced Java and Cutting-edge Applications Part 0: Course presentation Part 1 其实就是个括号匹配问题,Stack 经典问题,但是好久没用Java,有一点点生疏,感觉老师的版本要简洁的多 package tiei.ajp.test;import java.uti…

java项目之基于spring boot的多维分类的知识管理系统的设计与实现源码

项目简介 基于spring boot的多维分类的知识管理系统的设计与实现实现了以下功能: 基于spring boot的多维分类的知识管理系统的设计与实现的主要使用者管理员可以管理用户信息,知识分类,知识信息等,用户可以查看和下载管理员发布…

Python|OpenCV-实现识别目标图像中的圆圈(20)

前言 本文是该专栏的第22篇,后面将持续分享OpenCV计算机视觉的干货知识,记得关注。 在处理图像检测项目的时候,可能会遇到需要检测目标图像中的“圆圈”需求。笔者在这里举个例子,如下图所示: 在图中有一个篮球,但是我们要找的目标对象并不是篮球,而是篮球它本身的这个…

BUUCTF-MISC-数据包中的线索

下载题目文件,解压发现是一段流量包 使用Wireshark打开 首先过滤HTTP数据流 然后追踪HTTP数据流 通过追踪数据流可以发现 流7 当中有一段base64编码,我们尝试解码 base64基本特征 Base64编码只包含64个字符:大写字母(A-Z&#x…

(四)悟说几个特殊矩阵及矩阵函数

上一期介绍了矩阵的出现源于解线性方程组。但是,矩阵出现之后,就犹如打开了潘多拉的盒子,会产生许多魔法。 1 旋转矩阵 我们知道用矩阵左乘某个向量,相当于对该向量做线性变换。那么是否有一种矩阵,能让向量旋转&…

2D目标检测常用loss

在2D目标检测任务中,常用的损失函数(Loss)主要用于优化以下三个关键方面: 类别分类(Classification):用于区分检测到的对象属于哪一类。边界框回归(Bounding Box Regression&#x…

《代码整洁之道:程序员的职业素养》

作者:【美】Robert C. Martin 第1章 专业主义 专业主义就意味着担当责任,软件开发太复杂了,不可能没什么 bug。但很不幸,这并不能为你开脱。人体太复杂了,不可能尽知其全部,但医生仍要发誓不伤害病人。如…