2015-12-18 1 views
0

У меня есть сценарий bash, который использует туннелирование ssh для удаленного дампа PSQL, а затем помещает дамп в локальную базу данных MySQL.Сценарий Bash не выполняется в CRON (возможно, это связано с командами Sudo?)

Я не могу заставить CRON запускать его.

я выполнил следующие действия:

1) Ран:

sudo crontab -e 

2) введите следующую команду, чтобы получить сценарий для выполнения каждые 10 минут. Скрипт также занимает около 2-3 минут для полного выполнения.

*/10 * * * * /home/ubuntu/psqlimport 2>&1 /home/ubuntu/cronlog.log 

3) Ран:

sudo chmod +x /home/ubuntu/psqlimport 

4) перезапущен CRON:

sudo /etc/init.d/cron restart 

проверить свою базу данных, чтобы узнать, есть ли какие-либо обновления, и нет ни одного, как если бы сценарий никогда не исполнялся. Также не создается файл /home/ubuntu/cronlog.log. Когда я запускаю:

bash psqlimport 

Сценарий выполняется, как ожидалось.

Почему выполнение CRON не выполняется скриптом?

Имя файла: psqlimport

#!bin/bash 

### 
# 
# PostgreSQL to MySQL Dump program 
# 
# Filename: psqlimport 
# Description: This program dumps the 3 tables from a 
# remote PostgreSQL database, converts the dump file 
# into MySQL translatable INSERT INTO queries, 
# and inputs the data into the local 
# MySQL Inbevdash6 database. 
# 
# Script can be copied to the 
# /etc/cron.daily folder for daily database updates. 
# 
# 
# Script written by [email protected] 
# Date: December 15, 2015 
# Version: 01 
# 


#Set the dump file and temp file 
DUMPFILE='psql.dump.sql' || (echo "assign var failed" 1>&2; exit 1) 
TMPFILE=`mktemp` || (echo "mktemp failed" 1>&2; exit 1) 

#Tables to dump: table1, table2, table3 
#Dump as INSERT queries statements 


sudo -E sshpass -p "<remote host password>" \ 
ssh [email protected]_host \ 
pg_dump -U database_username -t table1 \ 
-t table2 -t table3 \ 
--column-inserts --data-only psqldatabase \ 
| awk '/^INSERT/ {i=1} /^SELECT/ {i=0} i' \ 
> "$TMPFILE" \ 
|| (echo "pg_dump failed" 1>&2; exit 1) 


#Adding transaction blocks to the dump file 
(echo "start transaction; truncate table table1; "; \ 
echo "truncate table table2; "; \ 
echo "truncate table table3; "; \ 
cat "$TMPFILE"; echo 'commit;') \ 
> "$DUMPFILE" \ 
|| (echo "parsing dump file failed" 1>&2; exit 1) 

#Inputting the dump file to the MySQL database 
mysql --defaults-file="/home/ubuntu/.mysql.db.cfg" < "$DUMPFILE" \ 
    || (echo "mysql failed" 1>&2; exit 1) 

#Remove the temp file created 
rm "$TMPFILE" 
rm "$DUMPFILE" 

ответ

2

У Вас есть ошибка в вашем shebang:

#!bin/bash 

Это должно быть

#!/bin/bash 

bin/bash, вероятно, не путь к чему-либо, если вы Выполняется из /. Это не было проблемой при выполнении сценария вручную, поскольку bash psqlimport явно вызывает bash для оценки сценария. Вы сможете увидеть проблему в действии, если попытаетесь запустить ./psqlimport для запуска скрипта.