【问题标题】:Cronjob script isn't working as expectedCronjob 脚本未按预期工作
【发布时间】:2016-09-07 13:13:21
【问题描述】:

我有一个脚本在我自己手动运行时运行良好,但似乎无法从 crontab 正常运行。

主要错误是没有设置(外部)环境变量。

我在 cronjob 定义上方添加了SHELL=/bin/bash,但仍然出现相同的错误。

我在下面复制并粘贴的脚本。为帮助干杯

#!/bin/bash
# export MYSQL_PORT_3306_TCP_ADDR=`awk 'NR==1 {print $1}' /etc/hosts`

set -e

MOUNT=/mnt/s3b/
BACKUP=/root/backups
mkdir -p $BACKUP
NOW=$(date +"%Y-%m-%d-%H%M")
DB_FILE="$MYSQL_ENV_MYSQL_DATABASE.$NOW.sql"

/usr/bin/s3fs <bucket_name> $MOUNT -ouse_cache=/tmp -odefault_acl=public-read -ononempty

mysqldump -h$MYSQL_PORT_3306_TCP_ADDR -uroot -p$MYSQL_ENV_MYSQL_ROOT_PASSWORD $MYSQL_ENV_MYSQL_DATABASE > /tmp/$DB_FILE

tar -czvf $BACKUP/"$DB_FILE.tar.gz" -P /tmp/$DB_FILE

cp $BACKUP/"$DB_FILE.tar.gz" $MOUNT/data/

您可以在下面看到所有环境变量返回的错误:

 May 11 00:17:59 fcf074b9e5ee kernel: [293368.874868] SELinux: mount invalid.    Same superblock, different security settings for (dev mqueue, type mqueue)
 May 11 00:18:14 fcf074b9e5ee kernel: [293383.903080] docker0: port 6(veth2f6467f) entered forwarding state
 May 11 01:29:26 fcf074b9e5ee s3fs[78]: s3fs.cpp:s3fs_init(3334): init v1.79(commit:unknown) with OpenSSL
 May 11 01:29:26 fcf074b9e5ee s3fs[78]: s3fs.cpp:s3fs_check_service(3729):     Could not connect wrong region us-east-1, so retry to connect region eu-west-1.
 May 11 01:31:10 fcf074b9e5ee s3fs[93]: s3fs.cpp:s3fs_init(3334): init v1.79(commit:unknown) with OpenSSL
 May 11 01:31:10 fcf074b9e5ee s3fs[93]: s3fs.cpp:s3fs_check_service(3729): Could not connect wrong region us-east-1, so retry to connect region eu-west-1.
  May 11 10:25:02 fcf074b9e5ee kernel: [329791.913331] hrtimer: interrupt took 2331455 ns

  mysqldump -h -uroot -p > /tmp/.2016-05-11-0015.sql

【问题讨论】:

  • $MYSQL_ENV_MYSQL_ROOT_PASSWORD 之类的所有变量在哪里定义?
  • 你的 crontab 设置了什么?您可以尝试的一件事是在您的 crontab 之前先设置您的 .profile,如下所示:0 0 * * * . ~/.profile; your crontab script
  • 你昨天问了同样的问题,然后你把它删除了。再说一遍:你是如何设置你的 cronjob 的?

标签: linux bash unix cron selinux


【解决方案1】:

正如@that-other-guy 所指出的,环境变量 $MYSQL_ENV_MYSQL_DATABASE, $MYSQL_ENV_MYSQL_ROOT_PASSWORD 没有设置。

当进程分叉时,环境变量会从进程继承给子进程。这意味着 crontab 作业将从 crontab 服务继承环境。安装 crontab 作业时在 shell 中设置的环境变量不会被保留。

你应该在你的 shell 脚本中添加:

MYSQL_ENV_MYSQL_DATABASE="mydatabase"
MYSQL_ENV_MYSQL_ROOT_PASSWORD="mypassword"

【讨论】:

    猜你喜欢
    • 2019-02-25
    • 2015-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-20
    • 2021-05-27
    相关资源
    最近更新 更多