crontab命令執行資料庫同步指令碼不生效

2021-08-18 21:46:52 字數 2644 閱讀 4572

在同步mysql資料庫中的資料到mongo中時,指令碼能夠手動成功執行,但是用定時任務啟動卻一定看不到結果,在郵件中發現沒有pymysql模組:

return-path:

x-original-to: root

delivered-to: [email protected]

from: [email protected] (cron daemon)

to: [email protected]

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語句固定好了,如果現在希望具體的內容是乙個變數,則可以修改 如下 問...