Linux at 命令C/C++实现 (在指定的时间执行命令)

在使用 Linux 系统时,我们通常首选 crontab 来安排作业。 命令还有另一个实用程序对于调度一次性任务非常有用。 它从标准输入或脚本/文件中读取命令,稍后可以执行一次。 但是我们不能将 at 命令用于任何重复性任务。 对于重复性任务,请使用 Linux crontab。

Linux crontab

Linux 系统包有一个名为 crontab 的有用的任务调度程序。 Crontab 很受欢迎,因为它可以安排为以 root 身份运行自动化进程。 因此,以 root 身份运行自动化进程可以更轻松地进行系统更改。 您只需要更改任务,然后等待任务重新启动即可。

在这里插入图片描述
cron 作业的命令存储在 Linux 系统上的 crontab 文件中,该文件通常位于 /etc/crontab 中。使用 crontab -l 显示 crontab 文件的内容。使用 crontab -e 编辑 crontab 文件等等。

在这里插入图片描述Linux的crontab有六个字段。 前五个字段定义了执行的时间和日期,第 6 个字段用于命令执行。
在这里插入图片描述

Linux at命令

at 是一个命令行实用程序,可安排在特定时间执行的命令。 用 at 创建的作业只执行一次。

在这里插入图片描述
在这里插入图片描述

如何使用 at 命令

at 命令的简化语法如下:

在这里插入图片描述
at 交互式

at 命令将您想要执行作业的日期和时间(运行时)作为命令行参数,并从标准输入中执行要执行的命令。

在即将到来的上午 11:00 安排任务:

在这里插入图片描述
退出交互式提示并按 Ctrl + d 保存计划的作业。使用 Ctrl + c 取消作业。

安排任务在 1 小时后执行:

at now + 1 hour

安排任务在 30 分钟后执行:

at now + 30 minutes

在即将到来的周日上午 11:00 安排任务:

at 10:00 AM Sun

在即将到来的 5 月 10 日上午 11:00 安排任务。

at 10:00 AM May 10

在 2022 年 5 月 22 日上午 11:00 安排任务:

at 11:00 AM 5/22/2022

在下个月的同一天上午 11:00 安排任:

at 11:00 AM next month

明天上午 11:00 安排任务:

at 11:00 AM tomorrow

可以使用 echo 并将命令传送到 at,不必使用 at 交互式提示符来安排任务。

echo 命令传送到at

以下命令将在早上 11:00 运行 backup.sh 脚本。

echo “sh test.sh” | at 11:00 AM

使用 atq 列出计划的作业

当我们使用 atq 按 root 帐户列出作业时,它会在结果中显示所有用户的作业。 但是,如果我们从非 root 帐户执行它,它将只显示该用户的作业。
在这里插入图片描述
字段说明:
首次提交:工作 ID
第二档:作业执行日期
第三场:作业执行时间
最后一个字段:用户名,计划在哪个作业下。

使用 atrm 删除计划作业

您可以使用 atrm 及其作业 ID 删除任何作业。

在这里插入图片描述

Linux at 命令C/C++实现

int main(int argc, char **argv, char **envp)
{

	/*-------------------------------------------------------------------------*
	*	check arguments	& pipe to "pwd"				           *
	*-------------------------------------------------------------------------*/
	if (argc < 2 || argc > 5) 
	{
		fprintf(stderr, "Usage: %s time [month day] [file]\n", argv[0]);
		exit(1);
	}
	if ((ltim = getltim(argv[1])) == -1) 
	{
		fprintf(stderr, "%s: wrong time specification\n", argv[0]);
		exit(1);
	}
	if ((argc == 4 || argc == 5) && (lday = getlday(argv[2], argv[3])) == -1) 
	{
		fprintf(stderr, "%s: wrong date specification\n", argv[0]);
		exit(1);
	}
	if ((argc == 3 || argc == 5) && open(argv[argc - 1], O_RDONLY) == -1) 
	{
		fprintf(stderr, "%s: cannot find: %s\n", argv[0], argv[argc - 1]);
		exit(1);
	}
	if (getcwd(pwd, sizeof(pwd)) == NULL) 
	{
		fprintf(stderr, "%s: cannot determine current directory: %s\n",
			argv[0], strerror(errno));
		exit(1);
	}

/*-------------------------------------------------------------------------*
 *	确定执行时间并创建“at”工作文件	   *
 *-------------------------------------------------------------------------*/
	time(&clk);
	p = localtime(&clk);
	year = p->tm_year;
	if (lday == NODAY) 
	{		
		lday = p->tm_yday;
		if (ltim <= (p->tm_hour * 100 + p->tm_min)) 
		{
			lday++;
			if ((lday == MAXDAYNR && (year % 4)) || lday == MAXDAYNR + 1) 
			{
				lday = STARTDAY;
				year++;
			}
		}
	} 
	...
}	

总结

at命令用于在指定时间执行命令,有时你需要定期或以预定的时间间隔执行任务,cron 任务用于“自动执行的任务”,它有助于简化重复的、有时是乏味的任务的执行。

欢迎关注微信公众号【程序猿编码】,需要at 命令完整源码的添加本人微信号(c17865354792)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值