Window shell文件在linux系統下執行不了的解決辦法
一些人喜歡用vim來寫linux shell script, 但是, 有的人喜歡在Windows下用一些方便的編輯器(比如鼎鼎大名的Notepad++)寫好, 然后拷貝文件到linux下, 結果呢, 在執行腳本a.sh的時候, 會出現如下問題:
[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, 看看, 果然是文件格式問題, 那怎么解決呢?
方法一:vim a.sh進入a.sh后, 在底部模式下, 執行:set fileformat=unix后執行:x或者:wq保存修改。 然后就可以執行./a.sh運行腳本了。(我親自試過, 是ok的)
方法二:直接執行sed -i "s/\r//" a.sh來轉化, 然后就可以執行./a.sh運行腳本了。(我親自試過, 是ok的)
方法三:直接執行dos2unix a.sh來轉化, 然后就可以執行./a.sh運行腳本了。(我的linux上執行dos2unix ./a.sh失敗, 但是不要放棄啊, 加個busybox就可以了), 如下:
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了。 第三種方法最方便, 建議用第三種!
執行定時任務的步驟(使用crontab,讓linux定時執行shell腳本)
使用crontab你可以在指定的時間執行一個shell腳本或者一系列Linux命令。例如系統管理員安排一個備份任務使其每天都運行
入門
# 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 示例
1、在 凌晨00:01運行
1 0 * * * /home/linrui/XXXX.sh
2、每個工作日23:59都進行備份作業。
59 11 * * 1,2,3,4,5 /home/linrui/XXXX.sh
或者如下寫法:
59 11 * * 1-5 /home/linrui/XXXX.sh
3、每分鍾運行一次命令
*/1 * * * * /home/linrui/XXXX.sh
4、每個月的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執行定時任務計划
在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”。
Ubuntu使用crontab定時任務
因為今天想定時執行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 就是要執行的命令
********************************************
ubuntu 使用sh 無法執行腳本文件的解決方法
最近剛開始學習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
然后就能正確運行了。
**********************************************