我是 Linux 新手,我正在尝试为我的树莓派自动更新/升级脚本。现在它设置为每 1 分钟执行一次,因此我可以查看它是否记录它所做的事情。稍后我将使其每 X 次运行一次。但是它不会记录任何内容,也不会创建 out.log 文件。
我采取的步骤:
crontab -e
#I used the following line
01 * * * * root apt-get update -y && apt-get upgrade -y > /home/cronbin/out.log
然后我保存它:
CTRL + X
Y
ENTER
我确实读过有关无人值守升级和这篇文章(apt-get Upgrade 不通过 crontab 作业安装升级)也是一本有趣的读物,但是我正在尝试学习/使用 Linux,因此决定仍然问这个问题,希望找出我做错了什么以及如何使其工作。
答案1
apt
通常需要 root 权限,因此您应该将其放在root crontab
而不是user crontab
.在 RPi 上,sudo
只要user crontab
用户圆周率,但这可能不适用于许多其他发行版 - 这不是一个好的做法。
相反,使用这个:
sudo crontab -e
这将打开root crontab
进行编辑,您可以输入类似的内容,该内容将在每天中午 12:00 运行apt-get update
一次apt-get upgrade
,并将所有结果写入文件/home/pi/upgrade_results.log
:
* 12 * * * apt-get update && sudo apt-get -y upgrade >> /home/pi/upgrade_results.log 2>&1
请查看
man apt-get
以获取您的系统的最新信息,以及使用此命令的所有重要详细信息。不需要
-y
任何选项,update
因为它通常不会提示用户。重定向
>>
追加输出到日志文件;如果您只想要最近运行的结果,请替换附加重定向与覆盖重定向:>
重定向
2>&1
将正常stdout
(1
) 输出与任何stderr
(2
) 错误消息结合起来;如果您从交互式 shell 的命令行运行这些命令,这与您在终端中获得的输出相同。看到crontab大师帮助安排您的日程安排。
当您测试此cron
作业时,不应以 1 分钟的间隔运行它,因为这样不得有足够的时间来运行这两个命令以完成。 IOW,你正在运行这些命令“在彼此之上”具有潜在的有害影响。如果您认为出于测试目的需要重复运行此命令,则应首先“手动”运行命令,然后在作业中使用-s
或选项。一旦您对作业的运行感到满意,请务必从命令中删除或选项。--dry-run
cron
cron
-s
--dry-run
apt-get
upgrade
可以产生相当数量的输出,如果你使用附加重定向>>
,您的日志文件会随着时间的推移而变得很大。您应该定期查看它,并修剪或直接删除该文件。如果您想限制日志的大小自动地,考虑该logrotate
命令,或者可能是另一个通过cron
管道将日志文件传送到临时位置的作业,并使用tail
-c
tmp文件。
答案2
crontab -e
您可以通过用户在子 shell 中运行升级root
!重要
像这样:
1 * * * * (/usr/bin/apt-get update;/usr/bin/apt-get dist-upgrade -y) >> /home/cronbin/out.log 2>&1
2>&1
将把任何错误转发到输出
哪个 outout 将附加到 /home/cronbin/out.log (尽管我认为/var/log/cron.log
更适合放置日志)
同样在crontab -e
你不指定user
时间之后:
01 * * * * root
^^^^
/etc/cron.*/
您仅在文件夹内的脚本中指定用户
答案3
如果您想使用命令crontab -e
来编辑cron
记录,您应该使用如下行:
1 * * * * apt-get update -y && apt-get upgrade -y > /home/cronbin/out.log
当您使用私人cron
记录时,您不应添加用户名(root) PS 并且最好将输出附加到日志文件而不是每次都重新创建它。替换这个:
> /home/cronbin/out.log
有了这个:
>> /home/cronbin/out.log
而且每分钟运行它也是不明智的,因为更新的执行可能需要更长的时间。您将有两个(或更多)apt
进程。合理的做法是每 24 小时运行一次更新/升级。