Window shell文件在linux系統下執行不了的解決辦法php
一些人喜歡用vim來寫linux shell script, 可是, 有的人喜歡在Windows下用一些方便的編輯器(好比鼎鼎大名的Notepad++)寫好, 而後拷貝文件到linux下, 結果呢, 在執行腳本a.sh的時候, 會出現以下問題:linux
[taoge@localhost learn_shell]$ ./a.sh bash: ./a.sh: /bin/bash^M: bad interpreter: No such file or directory [taoge@localhost learn_shell]$
什麼緣由呢, 咱們有理由懷疑是文件格式問題? 咱們用vim a.sh進入a.sh這個文件, 而後在底部模式下, 執行:set ff查看一下, 結果發現fileformat=dos, 看看, 果真是文件格式問題, 那怎麼解決呢?nginx
方法一:vim a.sh進入a.sh後, 在底部模式下, 執行:set fileformat=unix後執行:x或者:wq保存修改。 而後就能夠執行./a.sh運行腳本了。(我親自試過, 是ok的)shell
方法二:直接執行sed -i "s/\r//" a.sh來轉化, 而後就能夠執行./a.sh運行腳本了。(我親自試過, 是ok的)ubuntu
方法三:直接執行dos2unix a.sh來轉化, 而後就能夠執行./a.sh運行腳本了。(個人linux上執行dos2unix ./a.sh失敗, 可是不要放棄啊, 加個busybox就能夠了), 以下:vim
dos2unix a.sh
bash: dos2unix: command not found
[taoge@localhost learn_shell]$ busybox dos2unix a.sh
[taoge@localhost learn_shell]$
實際上, 通過上述三種方法修改後, 咱們均可以再用:set ff再查一下, 發現a.sh的fileformat果真是unix了。 第三種方法最方便, 建議用第三種!windows
執行定時任務的步驟(使用crontab,讓linux定時執行shell腳本)bash
使用crontab你能夠在指定的時間執行一個shell腳本或者一系列Linux命令。例如系統管理員安排一個備份任務使其天天都運行框架
入門less
# crontab –e
這樣能夠已編輯模式打開我的的crontab配置文件,而後加入一下這行:
0 0 * * * /home/linrui/XXXXXXXX.sh
這將會在天天凌晨運行 指定的.sh文件
Cron 各項的描述
如下是 crontab 文件的格式:
{minute} {hour} {day-of-month} {month} {day-of-week} {full-path-to-shell-script}
o minute: 區間爲 0 – 59
o hour: 區間爲0 – 23
o day-of-month: 區間爲0 – 31
o month: 區間爲1 – 12. 1 是1月. 12是12月.
o Day-of-week: 區間爲0 – 7. 週日能夠是0或7.
Crontab 示例
一、在 凌晨00:01運行
1 0 * * * /home/linrui/XXXX.sh
二、每一個工做日23:59都進行備份做業。
59 11 * * 1,2,3,4,5 /home/linrui/XXXX.sh
或者以下寫法:
59 11 * * 1-5 /home/linrui/XXXX.sh
三、每分鐘運行一次命令
*/1 * * * * /home/linrui/XXXX.sh
四、每月的1號 14:10 運行
10 14 1 * * /home/linrui/XXXX.sh
Crontab命令的選項
如下是 crontab 的有效選項:
crontab –e : 修改 crontab 文件. 若是文件不存在會自動建立。
crontab –l : 顯示 crontab 文件。
crontab -r : 刪除 crontab 文件。
crontab -ir : 刪除 crontab 文件前提醒用戶。
ThinkPHP實現定時任務
項目服務端框架我選用的是ThinkPHP,因爲策劃案中有需求要定時刷新指定數據,因此在windows平臺我使用微軟的計劃任務調用bat腳原本執行下面的命令來完成
php index.php /Home/cli
即便用PHP的CLI模式調用ThinkPHP的入口文件,而後再傳入指定控制器完成相應的數據處理。/Home/cli 爲我新增的名爲CliController的控制器,在類中index方法調用相應處理數據的模塊便可。特別注意:在windows平臺上執行時在bat腳本中必定要先將當前執行目錄切換到index.php所在目錄,而後執行php.exe index.php /Home/cli.
在linux平臺下使用的crontab來實現定時任務,經過crontab -e 新增一條命令,具體寫法可問問度娘,給出個人配置截圖:
# m h dom mon dow command 0 6 * * */bin/sh /mnt/share/Web/Cli_timer.sh
效果就是天天早上6點執行cli_timer.sh腳本,腳本內容以下:
sh -c "cd /mnt/share/WebServer;php index.php /Home/Cli;"
這裏須要說明的是在linux下若是cli_timer.sh腳本中只包含下面命令
php index.php /Home/Cli;
是會報路徑包含錯誤的,因此這裏在腳本中將當前工做路徑切換到index.php腳本放置的目錄,這樣就能正常使用了。
在ubuntu下,cron爲自帶的系統服務。
任意用戶下,輸入「crontab -e」便可進入任務編寫。相關提示大體以下:
# Edit this file to introduce tasks to be run by cron. # # Each task to run has to be defined through a single line # indicating with different fields when the task will be run # and what command to run for the task # # To define the time you can provide concrete values for # minute (m), hour (h), day of month (dom), month (mon), # and day of week (dow) or use '*' in these fields (for 'any').# # Notice that tasks will be started based on the cron's system # daemon's notion of time and timezones. # # Output of the crontab jobs (including errors) is sent through # email to the user the crontab file belongs to (unless redirected). # # For example, you can run a backup of all your user accounts # at 5 a.m every week with: # 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/ # # For more information see the manual pages of crontab(5) and cron(8) # # m h dom mon dow command
若是是第一次執行「crontab -e」,會提示選擇編輯器,選擇合適的編輯器便可。我選擇的是「4」,vim。
Select an editor. To change later, run 'select-editor'. 1. /bin/ed 2. /bin/nano <---- easiest 3. /usr/bin/vim.basic 4. /usr/bin/vim.tiny Choose 1-4 [2]:
而後,在最後面添加下面內容,而後保存並退出。
# test 3 * * * * date >>/tmp/test.txt
至於上面這個表達式的說明,請各看官自行度娘或谷歌。
好了,去看看「/tmp/test.txt」是否有內容吧。
下面是我期間遇到的幾個問題。
1.輸入「crontab -e」,提示「no crontab for root - using an empty one」
處理:這個是正常的,提示你,當前設定的用戶,沒有cron任務。
2.輸入「crontab -e」,輸入內容後,退出時,提示保存;保存後,任務不能成功添加。
處理:你選擇的編輯器有問題。請在root角色下輸入「select-editor」,能夠從新進行選擇。
3.編輯完任務並保存後,重啓服務的問題。
有些網文說是「service crond restart」進行服務重啓,在這裏,須要特別注意的是,在ubuntu下cron服務的重啓應該是「service cron restart 」。注意,是「cron」,而不是「crond」。
由於今天想定時執行postgres的一些腳本,因此在網上查一下有一個crontab的命令,就把這個命令的使用記錄一下,方便往後查找.
cron是一個[守護程序]用於在指定的時間內執行行程類的任務,每個用戶都有一個 crontab 文件,來容許他們指定須要執行的內容和時間,此外,系統也有一個 crontab ,用來容許像交替日誌和更新本地數據這樣有規則的任務。
環境:Ubuntn 12.10
1.使用 crontab -e命令
這個命令比較簡單直接輸入就能夠
#:crontab -e
出現以下窗口(第一次會提示你用那個編譯器,隨便選 一個就好了)
以後就能夠輸入你想執行的內容了.
好比:*/2 * * * * date >> /home/postgres/time.log 它的意思就是每過兩分鐘就向time.log文件中寫入固然的系統時間.
以後ctrl+X退出保存就好了.
2.保存crontab以後,咱們還要重啓crontab服務來使這個任務生效.
sudo service cron restart
3.看一下結果
vim /home/postgres/time.log
參數說明(我找的不少例子,看看就明白了.)
# m h dom mon dow command
m 分鐘 0-59
h 小時 0-23
dow 天1-31
mon 月 1-12
dow 星期 1-6 0表示星期天
command 就是要執行的命令
********************************************
最近剛開始學習linux shell語言
看的是鳥哥的私房菜,裏面有講到執行shell腳本有兩種方法:
1. 設置執行屬性: chmod 755 file
執行(若是已經在當前目錄) : ./file
2. 使用: sh file 執行
.可是在vmware裏裝的ubuntu 11.10卻沒法執行
#!/bin/bash declare -i s for (( i = 1; i <= 100;i = i+1 )) do s=s+i done echo "The count is ==> $s"
使用第二種方法執行時出現 :
test04_for.sh: 1: declare: not found
test04_for.sh: 3: Syntax error: Bad for loop variable
百度了下網上,解決方法:
在終端中輸入:
sudo dpkg-reconfigure dash
而後出現的界面中選擇 NO
而後就能正確運行了。
**********************************************