日程安排 - 正确的方法?

日程安排 - 正确的方法?

我正在关注 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和朋友们来救援!susudo、 和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 运行它。

相关内容