« 上一篇下一篇 »

Linux系统中如何实现在某个指定时间点运行或关闭命令

  有好几次,小编使用 rsync 将大文件传输到局域网上的另一个系统。由于它是非常大的文件,大约需要 20 分钟才能完成。我不想再等了,我也不想按 CTRL+C 来终止这个过程。我只是想知道在 Linux 操作系统中是否有简单的方法可以在特定的时间运行一个命令,并且一旦时间到就自动杀死它 —— 因此有了这篇文章。请继续阅读。

在 Linux 中在特定时间运行命令


我们可以用两种方法做到这一点。

方法 1 - 使用 timeout 命令

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

假设你只想运行一个命令 5 秒钟,然后杀死它。为此,我们使用:

$ 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 命令运行它,它将在给定的时间间隔后自动终止。如果该命令在超时后仍在运行,则可以发送 kill 信号,如下所示。

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

在这种情况下,如果 tail 命令在 10 秒后仍然运行,timeout 命令将在 20 秒后发送一个 kill 信号并结束。

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

$ man timeout

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

方法 2 - 使用 timelimit 程序

timelimit 使用提供的参数执行给定的命令,并在给定的时间后使用给定的信号终止进程。首先,它会发送警告信号,然后在超时后发送 kill 信号。

与 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

如果不带任何参数运行 timelimit,它将使用默认值:warntime=3600 秒、warnsig=15 秒、killtime=120 秒、killsig=9。有关更多详细信息,请参阅本指南最后给出的手册页和项目网站。

$ man timelimit


实例“

1 仅执行一次的任务
所需程序
atd服务
at命令
启动atd
# service atd restart
atd stop/waiting
atd start/running, process 11031
千万注意要在root下执行,不然会提示Rejected send message.

at的使用
使用at的权限(因为安全性考虑最好设置)
在/etc/at.allow中设置可以使用at的账号
在/etc/at.deny中设置不可以使用at的账号
示例
1分钟后执行mkdir
$ at now + 1 minutes
warning: commands will be executed using /bin/sh
at> mkdir helloAt
at> <EOT>
job 1 at Wed Feb  6 14:36:00 2013
查看工作
# at -c 2
#!/bin/sh
# atrun uid=0 gid=0
# ...
$ mkdir helloAt
特定时间关机
$ at 14:00 2013-2-9
warning: commands will be executed using /bin/sh
at> /bin/sync
at> /bin/sync
at> /sbin/shutdown -h now
at> <EOT>
job 4 at Sat Feb  9 14:00:00 2013
at如何执行
输入输出:标准输入输出会重定向到mailbox里,所以执行echo "hello"在终端下是看不到的
后台工作:系统会将at工作独立于shell,交给atd程序接管,即使关了shell也没关系
查询与删除at中的工作
查询:atq
删除:atrm jobid
batch:和at相似,只是在cpu负载低时才执行


2 循环执行的任务
所需程序
crontab
权限限制
/etc/cron.allow
/etc/cron.deny
示例
$ crontab -e #添加任务
进入编辑环境,使用vim编辑
格式:# m h dom mon dow command
m:minute, h:hour, dom:day of month
mon:month, dow:day of week
任务示例:0 5 * * 1 tar -zcf var/backups/home.tgz /home
*表示任何时间
$ crontab -l #查询任务
$ crontab -r #删除任务


3 可唤醒停机期间的工作任务
anacron:crontab任务因为关机没有执行,anacron可以在开机时检测没有执行的crontab任务,都执行一遍

以上就是Linux系统实现特定时间运行或关闭某个程序的方法。更多请关注数据吧资讯。