我有 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
我看到两个问题:
您正在运行需要 root 权限的程序,但以普通用户身份运行它们。
您使用的命令名称没有完整的路径,因此 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
)。