fre*_*ces 6 linux bash shell cron raspberry-pi
我正在我的 Raspberry Pi 上运行这个简单的脚本来自动更新,这样我就可以忘记它了。它还保留一个日志,说明更新是否成功。脚本是update.sh:
#!/bin/bash
echo "Update starts on: $(date)" >> /home/pi/update.log
if apt-get update && apt-get upgrade -y; then
echo "update successful $(date)" >> /home/pi/update.log
else
echo "Couldn't update $(date)" >> /home/pi/update.log
fi
Run Code Online (Sandbox Code Playgroud)
我通过使用将此脚本添加到根 crontabsudo crontab -e并将 cronjob 设置为每天早上 6 点运行
0 6 * * * /home/pi/update.sh
Run Code Online (Sandbox Code Playgroud)
我知道它在某种程度上有效,因为sudo ./update.sh在 shell 中运行手动运行命令并在日志中留下“成功”条目。另一方面,当从 crontab 运行时,我总是得到“无法更新”条目。万一重要,“update.sh”脚本是由“pi”用户创建的,我从未更改过权限,除了给它执行权限。
我读了另一个关于同一问题的问题,那个人通过sudo在命令前面放了一个来解决它。他承认这很奇怪,因为它已经被 root 执行了,但说它有效。我尝试添加sudo并验证它现在确实有效。
有谁知道为什么会这样?sudo如果它已经是root,为什么还需要它?
小智 8
Cron 从一个特殊的 shell 运行命令,与用户或 root shell 分开。此 shell 无权访问与用户相同的 PATH 变量。因此,当将脚本作为 cron 作业运行时,有两种选择:
A. 为脚本中的每个命令指定完整路径(即 aptitude-cron 的完整路径不知道去哪里寻找“apt-get”)
B. 我使用的小技巧 - 在编写 cron 作业行时,即使在 ROOT crontab 中,也要在脚本路径之前附加 sudo。这将诱使 cron 从 root shell 而不是 cron shell 运行脚本,这将允许它访问所有 root 的 PATH 变量。
这是因为 cron 是以非特权用户身份运行的,并且apt-get命令需要 root(也称为管理)提升权限才能运行。
另一种方法是在用户的 crontab 下运行此命令root:
sudo -i
<type user password>
crontab -e
Run Code Online (Sandbox Code Playgroud)
第一个命令将您的整个 shell 提升为 root 权限,而且最重要的是,您还可以访问 root 环境,而不仅仅是作为具有提升权限的用户的单个命令。
第二个命令将编辑根 crontab,而不是您自己的。
| 归档时间: |
|
| 查看次数: |
16046 次 |
| 最近记录: |