我需要以用户身份运行脚本来每晚备份我的数据库。我通过 ansible 在 /etc/cron.d/backup-mysql 中添加了以下 cron 作业。
0 3 * * * backup_mysql /path/backup-mysql.sh
我可以在 syslog 中看到正在运行的作业:
Apr 29 03:00:01 myserver CRON[1534185]: (backup_mysql) CMD (/path/backup-mysql.sh)
但是它什么也没做,我不明白为什么。我检查了路径,以用户身份运行了脚本。除了使用这个 cron 作业时,一切都正常。
我发现的解决方法是用以下方法替换该工作:
0 3 * * * root sudo -u backup_mysql /path/backup-mysql.sh
有效。
---------------------- 编辑 1 --------------------------
根据评论中@Gerald Schneider 的建议,我检查了昨天在测试期间 cron 发送的电子邮件:
From [email protected] Tue May 2 15:25:01 2023
Return-Path: <[email protected]>
Received: from myserver.com (localhost [127.0.0.1])
by myserver.com
for <[email protected]>; Tue, 2 May 2023 15:25:01 GMT
Received: (from backup_mysql@localhost)
by myserver.com
for backup_mysql; Tue, 2 May 2023 15:25:01 GMT
Date: Tue, 2 May 2023 15:25:01 GMT
Message-Id: <[email protected]>
From: [email protected] (Cron Daemon)
To: [email protected]
Subject: Cron <backup_mysql@myserver> /path/backup-mysql.sh
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <HOME=/home/backup_mysql>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=backup_mysql>
backup-mysql.sh: Script can only be run as the "backup_mysql" user
该脚本似乎由不同于 backup_mysql 的用户运行。但是,我指定该作业以此用户身份运行,所以我不知道为什么它不起作用。
以下是检查用户的脚本部分:
backup_owner="backup_mysql"
sanity_check () {
# Check user running the script
if [ "$USER" != "$backup_owner" ]; then
error "Script can only be run as the \"$backup_owner\" user"
fi
...
}
答案1
正如@Prem的评论所建议的那样,$USER
从cron.d运行时,我的脚本中未定义该变量。我更改了脚本以$USER
从whoami
命令中提取变量,现在它可以正常工作了。