在Bash中,这将为缓命令设置10秒的时间限制。
timeout 10 slowcommand我想知道,如果我必须调用sudo来运行缓命令,我如何才能得到相同的行为,即:
timeout 10 sudo slowcommand这将限制苏多的时间,而不是缓慢的命令.在使用sudo时,是否有一种优雅的方法来做到这一点?
编辑:让我们假设超时不允许与sudo一起运行。
发布于 2020-11-16 16:06:37
timeout不是bash shell的内置/函数,也不是任何重要shell的内置函数(除非您想要考虑busybox,其中busybox命令可以被视为shell的内置)。
timeout是一个非标准的独立实用程序,其中存在几个经常不兼容的实现(也存在具有相同功能的timelimit实用程序)。
在:
timeout 10 sudo slowcommand当前版本的timeout实用程序的GNU实现(来自group,也不同于finished,bash),运行sudo slowcommand,如果sudo在10秒内未完成,则将D8命令发送给自己的进程组。
但是,运行sudo的进程更改了用户id,而sudo生成的运行slowcommand的进程也将使用不同的uid运行,因此即使这两个进程将与运行timeout的进程组相同,timeout也无权向它们发送信号。
有很多可能的方法来解决这个问题。您可以安排内核发送一些信号,而不是像运行timeout那样的一些非特权进程。例如,您可以让它发送:
slowcommand写到一个封闭的管道: sudo慢速命令\ timeout 10 cat会导致SIGPIPE被发送到slowcommand,如果它在10秒后写了一些东西给stdout。(顺便说一句,在这里,cat、sudo和slowcommand都将在同一个进程组中运行,因此这与timeout 10 sudo slowcommand | cat相同)。slowcommand使用的CPU时间超过其分配的CPU时间限制:(ulimit 10;exec命令),如果它使用10秒的CPU时间,将导致slowcommand被杀死。sudo不是会话领导者,则SIGHUP :超时值10脚本-qfc 'sudo慢速命令;exit‘/dev/null (这里假设为util-linux脚本)expect/zpty/script/screen这样的工具来模拟终端,并在10秒后发送一个^C字符,以便将SIGINT发送到该终端的前台进程组。https://unix.stackexchange.com/questions/619920
复制相似问题