如何在Linux中运行命令一段特定时间

时间:2020-03-21 11:46:55  来源:igfitidea点击:

前几天,我使用rsync将大文件传输到局域网上的另一个系统。
由于文件很大,因此大约需要20分钟才能完成。
我不想等待那么久,也不想通过按CTRL + C来手动终止该过程。
是否有任何简单的方法可以在特定时间运行命令并在类似Unix的操作系统中将时间自动终止后自动将其杀死?

在Linux中运行命令一段时间

我们可以通过两种方法来做到这一点。

方法1:使用“timeout”命令

为此,最常用的方法是使用超时命令。
对于那些不知道的人,timeout命令将有效地限制进程的绝对执行时间。
timeout命令是GNU coreutils软件包的一部分,因此它已预先安装在所有GNU/Linux系统中。

让我们说,我们只想在特定时间运行命令,然后在经过该时间后自动将其终止。
为此,我们使用:

$timeout <time-limit-interval> <command>

例如,以下命令将在10秒后终止。

$timeout 10s tail -f /var/log/pacman.log

我们也不必为秒指定后缀“ s”。
以下命令与上面的命令相同。

$timeout 10 tail -f /var/log/pacman.log

其他可用的后缀是:

  • m 分钟
  • h 小时
  • d 天。

如果运行该tail -f /var/log/pacman.log命令,它将一直运行,直到我们通过按CTRL + C手动结束它为止。
但是,如果将其与timeout命令一起运行,它将在给定的时间间隔后自动终止。

以防万一即使超时后命令仍在运行,我们可以发送如下所示的终止信号。

$timeout -k 20 10 tail -f /var/log/pacman.log

在这种情况下,如果tail命令在10秒钟后仍在运行,则timeout命令将在20秒钟后向其发送终止信号并结束。

在对硬件问题进行故障排除时,Tmeout命令可能特别有用。
例如,运行以下命令以显示来自内核环形缓冲区的所有消息,但仅显示10秒钟。

$timeout 10 dmesg -w

有关更多详细信息,请查看手册页。

$man timeout

有时,特定程序可能需要很长时间才能完成并最终冻结系统。
在这种情况下,我们可以使用此技巧在特定时间后自动结束该过程。

另外,请考虑使用Cpulimit(一个简单的应用程序)来限制进程的CPU使用率。

方法2:使用“timelimit”程序

Timelimit实用程序使用提供的参数执行给定的命令,并在给定的时间后以给定的信号终止生成的过程。
首先,它将传递警告信号,然后在超时后,它将发送终止信号。

与timeout实用程序不同,“timelimit”具有更多选项。
我们可以传递一些参数,例如killsig,warnsig,killtime,warntime等。

它在基于Debian的系统的默认存储库中可用。
因此,我们可以使用以下命令进行安装:

$sudo apt-get install timelimit

对于基于Arch的系统,它在AUR中可用。
因此,我们可以使用任何AUR帮助程序来安装它,例如Pacaur,Packer,Yay,Yaourt等。

对于其他发行版,请从此处下载源代码并手动安装。

安装Timelimit程序后,在特定时间(例如10秒)内运行以下命令:

$timelimit -t10 tail -f /var/log/pacman.log

如果运行不带任何参数的时间限制,它将使用默认值:warntime = 3600秒,warnsig = 15,killtime = 120,killsig = 9.

有关更多详细信息,请参阅本教程末尾的手册页和项目。

$man timelimit