首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何对需要sudo的命令使用bash超时函数?

如何对需要sudo的命令使用bash超时函数?
EN

Unix & Linux用户
提问于 2020-11-16 15:02:30
回答 1查看 1.5K关注 0票数 1

在Bash中,这将为缓命令设置10秒的时间限制。

代码语言:javascript
复制
timeout 10 slowcommand

我想知道,如果我必须调用sudo来运行缓命令,我如何才能得到相同的行为,即:

代码语言:javascript
复制
timeout 10 sudo slowcommand

这将限制苏多的时间,而不是缓慢的命令.在使用sudo时,是否有一种优雅的方法来做到这一点?

编辑:让我们假设超时不允许与sudo一起运行。

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2020-11-16 16:06:37

timeout不是bash shell的内置/函数,也不是任何重要shell的内置函数(除非您想要考虑busybox,其中busybox命令可以被视为shell的内置)。

timeout是一个非标准的独立实用程序,其中存在几个经常不兼容的实现(也存在具有相同功能的timelimit实用程序)。

在:

代码语言:javascript
复制
timeout 10 sudo slowcommand

当前版本的timeout实用程序的GNU实现(来自group,也不同于finished,bash),运行sudo slowcommand,如果sudo在10秒内未完成,则将D8命令发送给自己的进程组。

但是,运行sudo的进程更改了用户id,而sudo生成的运行slowcommand的进程也将使用不同的uid运行,因此即使这两个进程将与运行timeout的进程组相同,timeout也无权向它们发送信号。

有很多可能的方法来解决这个问题。您可以安排内核发送一些信号,而不是像运行timeout那样的一些非特权进程。例如,您可以让它发送:

  • SIGPIPE如果slowcommand写到一个封闭的管道: sudo慢速命令\ timeout 10 cat会导致SIGPIPE被发送到slowcommand,如果它在10秒后写了一些东西给stdout。(顺便说一句,在这里,catsudoslowcommand都将在同一个进程组中运行,因此这与timeout 10 sudo slowcommand | cat相同)。
  • 如果slowcommand使用的CPU时间超过其分配的CPU时间限制:(ulimit 10;exec命令),如果它使用10秒的CPU时间,将导致slowcommand被杀死。
  • 如果终端挂起,且sudo不是会话领导者,则SIGHUP :超时值10脚本-qfc 'sudo慢速命令;exit‘/dev/null (这里假设为util-linux脚本)
  • SIGINT/SIGQUIT您还可以使用像expect/zpty/script/screen这样的工具来模拟终端,并在10秒后发送一个^C字符,以便将SIGINT发送到该终端的前台进程组。
票数 6
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/619920

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档