操作系统:Ubuntu 16.04
我查看了很多不同的文章和线程,但我仍然无法让我的cron.hourly
工作自动运行。我正在尝试在我的 PostgreSQL 数据库上运行备份。在/etc/cron.hourly
中,我只有一个名为pg_backup
. 以下是它的权限:
-rwxr-xr-x 1 root root 1543 Oct 16 19:07 pg_backup
如果我运行run-parts --test /etc/cron.hourly
,输出如下:
/etc/cron.hourly//pg_backup
这看起来不错。如果我手动运行脚本run-parts
,它会按预期工作并备份我的数据库。这是我正在使用的命令:
run-parts -v --report /etc/cron.hourly
这很好,但无论出于何种原因,它并不是每小时都在运行。我真的不知道有什么问题。我检查了所有日志,但没有找到任何错误消息。
我错过了什么?
更新
我注意到我的/etc/crontab
文件具有这样指定的外壳:SHELL=/bin/sh
. 我的脚本在 bash 中运行。将shebang放在我的脚本顶部是否足以使用bash?#!/bin/bash
更新 2
正如 Broco 所建议的,我将这项工作放在了我的 crontab 中,但它仍然无法正常工作。这是我所做的:
sudo crontab -e
然后我在文件中添加了以下内容:
* * * * * root /etc/cron.hourly/pg_backup
我让它每分钟运行一次,以便更快地获得关于它是否正在运行的反馈,它似乎正在运行,但实际上并没有执行备份。
这是我的系统日志的一部分。我使用了命令grep CRON /var/log/syslog
:
Oct 17 14:02:01 User CRON[63871]: (root) CMD (root /etc/cron.hourly/pg_backup)
Oct 17 14:02:01 User CRON[63870]: (CRON) info (No MTA installed, discarding output)
Oct 17 14:03:01 User CRON[63917]: (root) CMD (root /etc/cron.hourly/pg_backup)
Oct 17 14:03:01 User CRON[63916]: (CRON) info (No MTA installed, discarding output)
Oct 17 14:04:01 User CRON[63966]: (root) CMD (root /etc/cron.hourly/pg_backup)
Oct 17 14:04:01 User CRON[63965]: (CRON) info (No MTA installed, discarding output)
Oct 17 14:05:01 User CRON[64013]: (root) CMD (root /etc/cron.hourly/pg_backup)
Oct 17 14:05:01 User CRON[64012]: (CRON) info (No MTA installed, discarding output)
Oct 17 14:05:01 User CRON[64014]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Oct 17 14:06:01 User CRON[64060]: (root) CMD (root /etc/cron.hourly/pg_backup)
Oct 17 14:06:01 User CRON[64059]: (CRON) info (No MTA installed, discarding output)
Oct 17 14:07:01 User CRON[64106]: (root) CMD (root /etc/cron.hourly/pg_backup)
Oct 17 14:07:01 User CRON[64105]: (CRON) info (No MTA installed, discarding output)
您的 cron 作业正在运行,但该作业有问题。
您通常应该收到一封包含输出(和错误!)的电子邮件,但您没有收到电子邮件,因为:
您的系统上没有安装任何能够发送邮件的东西。因此,输出被丢弃。
考虑安装 MTA,以便您可以通过电子邮件将输出发送给您,然后找出实际发生的情况。
我想到了!正如迈克尔汉普顿指出的那样,我的工作正在运行,但它有一些错误。我没有安装 MTA,所以我安装
postfix
了sudo apt-get install postfix
. 这样做之后,我可以查看/var/mail/root
文件以查看与我的cron
工作相关的错误消息。我的主要问题最终与缺少环境变量有关。由于
cron
运行 onroot
,每当脚本运行时都没有设置我的环境变量。所以,我.bashrc
在我的脚本顶部包含了这样的内容:source "$HOME/.bashrc"
在我
root
的用户中.bashrc
,我添加了脚本所需的环境变量。但是,这仍然行不通;脚本运行时仍未设置环境变量。为了解决这个问题,我在脚本中添加了以下行,包括.bashrc
:export PS1="1"
从这个线程,这个环境变量防止
.bashrc
在非交互式会话中加载,所以当它被设置时,.bashrc
将加载。非常感谢大家的帮助!