在同步mysql資料庫中的資料到mongo中時,指令碼能夠手動成功執行,但是用定時任務啟動卻一定看不到結果,在郵件中發現沒有pymysql模組:
return-path:
x-original-to: root
delivered-to: [email protected]
from: [email protected] (cron daemon)
subject: cron sh /data/cron/backup.sh
content-type: text/plain; charset=utf-8
auto-submitted: auto-generated
x-cron-env:
x-cron-env:
x-cron-env:
x-cron-env:
x-cron-env:
x-cron-env:
date: tue, 1 apr 2014 10:58:01 -0400 (edt)
status: r
/data/cron/backup.sh: line 27: my
sql: command not found
從上面可以看到,說mysql命令沒有找到,於是執行了一下命令:
[root@test data]# echo $path
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/nginx/sbin:/usr/local/mysql/bin
這樣就知道了問題所在,在crontab裡的執行環境變數與root使用者設定的環境變數不一致,從上面兩個可以看出區別:
crontab裡的環境變數:x-cron-env:
root使用者的環境變數:
path=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/nginx/sbin:/usr/local/mysql/bin
現在我們已經知道了,mysql這個命令是放在/usr/local/mysql/bin下面,而crontab的path變數中卻沒有這一條,所以出現mysql: command not found的問題。
同時,我們可以新建乙個指令碼,在crontab裡驗證一下path變數:
[root@test data]# vi path.sh
#!/bin/bash
echo $path
# 儲存後,加入到crontab
[root@test data]# crontab -e
*/1 * * * * /data/path.sh
1分鐘後,可以看到:
/usr/bin:/bin
知道了問題,那就好解決了,有兩種:
1. 在備份指令碼裡,手動設定一下,例如:
#!/bin/bash
. /etc/profile
....餘下內容...
這裡需要「. /etc/profile」,是因為朋友的mysql是自己編譯的,把mysql的路徑都新增到這裡:
path=$path:$home/bin:/usr/local/nginx/sbin:/usr/local/mysql/bin
export path
2. 直接設定使用者的crontab,新增路徑/usr/local/mysql/bin,例如:
[root@test data]# crontab -e
shell=/bin/bash
path=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/nginx/sbin:/usr/local/mysql/bin:/root/bin
mailto=root
home=/
0 */12 * * * sh /data/cron/backup.sh
儲存之後,就可以正常備份了。
另外可以了解乙個檔案/etc/crontab:
[root@test data]# cat /etc/crontab
shell=/bin/bash
path=/sbin:/bin:/usr/sbin:/usr/bin
mailto=root
home=/
# for details see man 4 crontabs
# example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) or jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (sunday=0 or 7) or sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
linux定時執行crontab 執行資料庫備份
crontab e 進入乙個vi 編輯介面 在最後一行加上 30 netstat tmp net.log 表示每隔30分就執行netstat命令,並把執行結果存入net.log中。crontab是乙個很方便的在unix linux系統上定時 迴圈 執行某個任務的程式 使用cron服務,用 servi...
直接執行資料庫命令
使用 ef 4.1 或者更新版本,你可以直接執行任何資料庫命令.在本節介紹的方法允許你對資料庫執行原生的 sql 命令.通過 sql 查詢語句獲取實體物件集 dbset 類中的 sqlquery 方法允許你執行乙個返回實體物件集的原生 sql 查詢.預設情況下,返回的物件集會被上下文跟蹤 這可以通過...
java資料庫程式設計 執行資料庫更新操作
一,本章目標 可以使用connection物件取得statement例項 可以使用statement進行資料增加,修改,刪除操作 二,具體內容 所有的操作都必須從連線展開,通過連線取得操作的介面例項。例項 如下 以上的程式是將sql語句固定好了,如果現在希望具體的內容是乙個變數,則可以修改 如下 問...