2014-04-05 25 views
13

Tôi có dòng này trong crontab:Cron Job - Làm thế nào để gửi một tập tin đầu ra để một email

* * * * * /var/www/dir/sh/mysql_dumb.sh | mail -s "mysql_dump" [email protected] 

(mỗi phút chỉ có một mẫu)

Vì vậy, tất cả hoạt động tốt, nhưng email là trống.

UPDATE:

Kết quả từ mysql_dumb.sh là một tập tin *.sql và họ lưu các tập tin trong một thư mục.

Làm cách nào để gửi bản sao (* .sql) từ đầu ra này ->mysql_dumb.sh vào email của tôi?

mysql_dumb.sh:

#!/bin/bash 
PATH=/usr/bin:/bin 
SHELL=/bin/bash 
/usr/bin/mysqldump -u USER -pPASS DATABASE > /var/www/dir/backup/backup_DB_`date +%d_%m_%Y`.sql 
+1

như một mẹo, bạn có thể ngăn chặn email trống không được gửi đi bằng cách sử dụng 'cái cờ -E' ('email -E -s ... ') – shx2

+0

@ shx2 đó không phải là những gì --help nói, -E, --exec = COMMAND thực hiện COMMAND – meffect

+0

@ shx2 nevermind, tôi cần sudo apt-get cài đặt bsd-mailx. http://manpages.ubuntu.com/manpages/utopic/man1/bsd-mailx.1.html – meffect

Trả lời

34

Nếu kịch bản được báo cáo lỗi, họ có thể sẽ stderr, nhưng bạn chỉ chuyển hướng stdout. Bạn có thể chuyển hướng stderr bằng cách thêm 2>&1 để lệnh:

* * * * * /var/www/dir/sh/mysql_dump.sh 2>&1 | mail -s "mysql_dump" [email protected] 
+0

Xin chào .. Tôi cập nhật câu hỏi của mình. Đó là kết quả tương tự đối với tôi ... Một email trống. – aldanux

+2

Tại sao bạn không đặt 'cat XXX.sql' trong tập lệnh để nội dung của tệp sẽ được đưa vào email? – Barmar

+0

Ok .. Cảm ơn bạn rất nhiều! 'mèo' là sai lầm của tôi! – aldanux

0

Nhìn vào dòng cuối cùng của mysql_dumb.sh: /usr/bin/mysqldump -u USER -pPASS DATABASE > /var/www/dir/backup/backup_DB_`date +%d_%m_%Y`.sql

Các > đang chuyển hướng đầu ra của mysqldump đến tập tin /var/www/dir/backup/backup_DB_ date +% D_ % m_% Y .sql

Bạn có muốn lưu trữ bản sao lưu của cơ sở dữ liệu cục bộ không?

Nếu không, đưa ra các các > /var/www/dir/backup/backup_DB_`date +%d_%m_%Y`.sql và đặt mục crontab trở lại

* * * * * /var/www/dir/sh/mysql_dump.sh 2>&1 | mail -s "mysql_dump" [email protected]

Nếu bạn muốn có một bản sao của tập tin địa phương, tôi sẽ đề nghị sử dụng tee mà sẽ viết ra để các tập tin và đưa đầu ra trở lại trên stdout, mà sau này sẽ được chọn bởi crontab.

tôi sẽ thay đổi dòng cuối cùng của mysql_dumb.sh là: /usr/bin/mysqldump -u USER -pPASS DATABASE | tee /var/www/dir/backup/backup_DB_`date +%d_%m_%Y`.sql

Một lần nữa tôi sẽ thay đổi mục crontab trở lại: /usr/bin/mysqldump -u USER -pPASS DATABASE > /var/www/dir/backup/backup_DB_`date +%d_%m_%Y`.sql

Ưu điểm ở đây là thư có thể đọc các thông tin từ stdout và isn không phụ thuộc vào tập tin được viết và sau đó đọc chính xác. Trong khi đó có thể là một sự khác biệt nhỏ, trong kinh nghiệm của tôi sử dụng tee sẽ đáng tin cậy hơn.

12

Từ góc độ crond chính xác hơn là đặt vào cron của bạn:

[email protected] 
* * * * * /var/www/dir/sh/mysql_dumb.sh 
* * * * * /var/www/dir/sh/other.sh 
* * * * * /var/www/dir/sh/other2.sh 
+2

đây là câu trả lời đúng – MitchBroadhead

+0

Điều này sẽ gửi email cho tất cả các mục nhập trong crontab, không chỉ là một dòng. – jamsandwich

Các vấn đề liên quan