从一个现场升级遇到的问题说起
有一次,现场升级项目的时候发生了如下错误
这个错误很陌生,之前没遇到过,从报错提示看是atd进程没有运行?
第一个想到的方式是,手动启动atd服务
sudo service atd start
# or
systemctl start atd
systemctl enable atd
然后重新上传包,升级成功了。
既然现场遇到这样的问题,并且项目升级脚本用到了at命令,就有必要学习一下,掌握at命令的使用。
接下来,让我们来看一下at命令的正确用法和不正确用法。
at命令的正常使用方式
-
在指定的时间运行一次命令:
echo "backup_files.sh" | at 10:00 AM tomorrow 这个命令将在明天上午10点运行backup_files.sh脚本。 -
在指定的时间运行一次多条命令:
echo "command1; command2" | at now + 1 hour 这个命令将在当前时间的一小时后运行两个命令。 -
在指定的时间运行重定向输出:
echo "command > output.txt" | at 11:00 PM 这个命令将在晚上11点运行命令,并将输出重定向到output.txt文件中。 -
在指定的时间运行脚本:
at 11:00 PM < script.sh 这个命令将在晚上11点运行script.sh脚本。
at命令的不正确用法
错误1:at命令没有运行
没有启动atd服务,就会报文章一开始的错误。需要启动该服务。
错误2:at命令要启动的脚本或命令错误
这种情况通常不是at命令导致,是at命令定时要启动的任务有问题,这种情况需要你去测试一下具体的定时任务,成功后在让at命令去执行该任务
错误3:at命令没有按照预期运行
这种情况有可能是时间格式不正确或系统时钟不准确导致的。
要解决此问题,首先要用date命令查看系统时间,如果不正确,需要使用如下命令校正
sudo ntpdate time.nist.gov
其他错误用法
-
在at命令中使用绝对路径名:
echo "/usr/local/bin/command" | at 3:00 PM 这个命令会失败,因为at命令的环境变量不包含/usr/local/bin目录。应该使用相对路径或者设置正确的环境变量。 -
在at命令中使用sudo:
echo "sudo command" | at 2:00 AM 这个命令会因为at命令没有sudo权限而失败。应该在命令中直接使用sudo。 -
在at命令中使用交互式命令:
echo "vim file.txt" | at 5:00 PM 这个命令会失败,因为vim是一个交互式命令。应该使用非交互式命令或者使用cron等其他工具。 -
在at命令中使用错误的时间格式:
echo "command" | at 2:00 PM next week 这个命令会失败,因为时间格式不正确。应该使用正确的时间格式,例如HH:MM AM/PM。
说在最后
项目中有很多的地方会用Linux命令、shell脚本,这方面的知识也有很多,无法一一去掌握,但是常用的还是有必要掌握一些的。通过本文,相信你也可以掌握通过at命令来启动一个定时任务