Cron:为什么我的 cron 脚本没有运行,即使 cron 正在运行

Cron:为什么我的 cron 脚本没有运行,即使 cron 正在运行

我有 4 个脚本将数据库从一台服务器传输到另一台服务器以进行测试。这些脚本在夜间自动执行。当我手动调用脚本时,没有收到错误,但如果不手动运行它们,我看不到任何正在传输的数据。

服务器1:

ps -ef | grep cron
root      2350     1  0 Apr23 ?        00:00:26 /usr/sbin/cron
root     14293  9533  0 10:52 pts/4    00:00:00 grep cron

服务器2:

ps -ef | grep cron
root     11269  8661  0 10:52 pts/1    00:00:00 grep cron
root     21726     1  0 Jan30 ?        00:00:31 /usr/sbin/cron

服务器1

crontab -e
# m h  dom mon dow   command
0 3 * * * /home/deploy/scripts/clearzip.sh
19 2 * * * /media/attachment/send_db.sh

发送数据库文件

#! /bin/bash
pg_dump -C "DB_NAME" | bzip2 | sshpass -v ssh user@server2 "bunzip2 | psql "DB_NAME""
pg_dump -C "DB2" | bzip2 | sshpass -v ssh user@server2 "bunzip2 | psql "DB2""

服务器2:

# m h  dom mon dow   command
12 2 * * * ./home/postgres/stop_services.sh
17 2 * * * ./home/postgres/dropdb.sh
55 5 * * * ./home/postgres/start_services.sh

stop_services.sh:

#! /bin/bash
echo > >(tee -i /home/deploy/logfile.txt)
sh /home/deploy/tomcat7/bin/catalina.sh stop
killall java
killall screen

dropdb.sh

su -c "psql -c 'drop database "DB1";'" -s /bin/sh postgres
su -c "psql -c 'create database "DB1";'" -s /bin/sh postgres
su -c "psql -c 'drop database "DB2";'" -s /bin/sh postgres
su -c "psql -c 'create database "DB2";'" -s /bin/sh postgres

我可能做错了什么?有任何想法吗?

更新

日志文件中的错误

could not change directory to "/root": Permission denied
could not change directory to "/root": Permission denied
could not change directory to "/root": Permission denied
could not change directory to "/root": Permission denied
/home/postgres/start_services.sh: line 5: service: command not found
/home/postgres/start_services.sh: line 6: service: command not found

答案1

我看到两个问题:

  1. 您正在运行需要 root 权限的程序,但以普通用户身份运行它们。

  2. 您使用的命令名称没有完整的路径,因此 cron 打开的会话不知道在哪里可以找到它们。

要修复 1.,请不要使用crontab -e,而是编辑/etc/crontab,或者更简单,运行sudo crontab -e将其添加到 root 的 crontab。然后,编辑dropdb.sh并删除su(该脚本现在将由 root 启动,因此不需要su)。

要解决问题 2,最简单的方法是在 crontab 中定义 PATH。它应该看起来像这样:

PATH=/bin:/sbin:/usr/sbin:/usr/local/sbin:/usr/local/bin:/usr/bin
# m h  dom mon dow   command
12 2 * * * ./home/postgres/stop_services.sh
17 2 * * * ./home/postgres/dropdb.sh
55 5 * * * ./home/postgres/start_services.sh

或者,编辑脚本并确保它们全部使用绝对路径(因此/usr/sbin/service而不是service)。

相关内容