我正在关注 youtube 视频和在线课程,学习 Linux 命令,提高技能,努力变得更好。目前正在尝试了解调度。
我的 Raspberry Pi 在无头 Raspbian 上运行 owncloud。我想安排它每周一次将 owncloud 置于维护模式,先 apt-get update 然后 apt-get Upgrade,然后将 owncloud 退出维护模式。 Owncloud (php) 命令应从用户 www-data 发出,而 apt-get 应以 root 身份运行。到目前为止,我已经尝试过:
sudo -u www-data crontab -e
添加行0 7 * * 1 php /var/www/owncloud/occ maintenance:mode --on
然后
sudo crontab -e
添加行1 7 * * 1 apt-get update && apt-get upgrade -y
但在这里我陷入困境。在 apt-get Upgrade -y 返回退出状态 0 后,如何告诉系统将 owncloud 退出维护模式?我考虑过将 root 的 crontab 中的条目设置为
1 7 * * 1 apt-get update && apt-get upgrade && php /var/www/owncloud/occ maintenance:mode --off
但 Maintenance:mode --off 失败,因为它不是由用户 www-data 运行。我可以安排最后一个命令在几分钟后作为 www-data 运行,但我宁愿它在 apt-get Upgrade -y 给出退出状态 0 时运行。有没有办法做到这一点?
答案1
su
和朋友们来救援!su
、sudo
、 和super
都可以在这里使用。su
是传统的,sudo
是最简单的,并且super
如果您希望用户能够执行其中的部分操作,则具有优势。
apt-get upgrade
由于您特别提到测试您将使用的退出状态1 7 * * 1 apt-get update && apt-get upgrade && sudo -u www-data php /var/www/owncloud/occ maintenance:mode --off
。
现在这有点长了,所以遵循 thrig 的建议并将其放入脚本中具有优点,但他的示例有两个缺点:它不检查返回值,并且命令上的维护模式直接跟随下一个命令,我假设进入维护模式和启动 apt-get 之间存在延迟是有原因的,所以你可能想要更多类似这样的东西:
#!/bin/sh
set -e
sudo -u www-data php /var/www/owncloud/occ maintenance:mode --on || sudo -u www-data php /var/www/owncloud/occ maintenance:mode --on
sleep 1m || true
apt-get update || apt-get update
apt-get upgrade -y || apt-get install
sudo -u www-data php /var/www/owncloud/occ maintenance:mode --off || sudo -u www-data php /var/www/owncloud/occ maintenance:mode --off
但你已经有了一个良好的开端。
答案2
您可能需要一个脚本来按顺序执行所有必要的步骤:
#!/bin/sh
sudo -u www-data php /var/www/owncloud/occ maintenance:mode --on
apt-get update && apt-get upgrade -y
sudo -u www-data php /var/www/owncloud/occ maintenance:mode --off
然后从 root 的 crontab 运行它。