需求:需要每一天對數據庫做一個備份,oracle數據庫,linux系統。
備份命令采用最簡單的導出\導入。
首先確認服務器是否開啟任務計划服務,只有root用戶才能對crond服務進行開啟和關閉
[root@enfo124 ~]# service crond status
crond (pid 1758) is running...
[root@enfo124 ~]# service crond stop
Stopping crond: [ OK ]
[root@enfo124 ~]# su - cognos
[cognos@enfo124 ~]$ service crond status
crond is stopped
[cognos@enfo124 ~]$ su - root
[root@enfo124 ~]# service crond start
Starting crond: [ OK ]
[root@enfo124 ~]# service crond status
crond (pid 2805) is running...
[root@enfo124 ~]# su - cognos
[cognos@enfo124 ~]$ service crond status
crond (pid 2805) is running...
最初sh文件內容為
------------------------------------------------------------
#!/bin/bash
expdp username/password@enforc directory=kettledb dumpfile=enforc_$(date +%Y%m%d%H%M).dmp logfile=enforc_$(date +%Y%m%d%H%M).log
-----------------------------------------------------------
文件名字與路徑
/home/oracle/bin/export_enforc.sh
部署開始,切換至oralce用戶,查看oracle用戶的crontab 計划(crontab -l)。進入任務計划的編輯模式(crontab -e)
添加入以下行:
30 18 * * * /home/oracle/bin/export_enforc.sh
每天18:30分執行export_enforc.sh文件,結果不執行,手工賦值執行/home/oracle/bin/export_enforc.sh是可以的。
於是看了前輩寫的sh后說執行的環境不對於是加入以下幾行:
#!/bin/bash
if [ -f ~/.bash_profile ];
then
. ~/.bash_profile
fi
expdp username/password@enforc directory=kettledb dumpfile=enforc_$(date +%Y%m%d%H%M).dmp logfile=enforc_$(date +%Y%m%d%H%M).log
執行命令:
[oracle@enfo212 ~]$ cd ~/
[oracle@enfo212 ~]$ pwd
/home/username
----------可以看出來~/代表用戶家目錄/home/username。
. 文件= bash 文件 (執行shell文件)
由此可以看出-f查找如果目錄存在這個系統環境文件則執行,建造一個shell環境,每個用戶都有自己的.bash_profile
再次部署到crontab里面可以看到:
隨便部署一個將要發生的時間點,任務被執行,這樣就每天在這個時間點就對數據庫enforc坐了導出的工作
具體為什么加入哪些代碼?可以參考 /home/username/.bash_profile 文件
PS:總結crontab任務不執行可以從這些方面入手
1:請確保手工可以執行該文件(給sh文件增加X權限,看文件格式是否為unix→ set ff? →set ff=unix)
2:確認開始crond服務(service crond status/start/stop)
3: 確認給sh文件制定bash環境
if [ -f ~/.bash_profile ];
then
. ~/.bash_profile
fi