想要在 Windows XP/2003 sever 上要自動化並不難。早期在 Windows NT 3.51/4.0 時代,如果要讓 Windows 自動執行一些動作,方法就是先使用 DOS shell 指令寫一個 .bat 或 .cmd 檔,然後以 at 這個指令,指定要執行的時間。如此一來,時間一到,就會自動去執行你要電腦自動執行的動作。早期我在中時電子報工作時,就是一直運用這樣的機制。但是 DOS shell 超難寫,困難程度只有真正去做過才能體會。所以 Microsoft 就出了一套 base on VBscript 的 script,就是讓這樣的工作比較輕鬆一點。但是,我看除非去考過微軟認證考試[1]的人,才會聽過這種東西,而要想很流利地撰寫這種腳本程式的人 ,卻不會太多,因為有心人光是要找教材就夠你傷腦筋了。好像最好的資料來源是 Microsoft Technet,喔...還是非得吃微軟餵的東西不可,就算覺得不好吃還不能不吃。
Unix 的使用者就輕鬆多了,光是 shell,你就有很多選擇可以使用,你可以用骨灰級的 Bourn Shell (sh)、C Shell (csh),也可以選 Korn shell (ksh)、Z Shell (zsh)、tcsh、bash (Bourn Again Shell)...,甚至還有 Perl、PHP...這些版本的 shell 可供選擇。教材來說,市面上有的最多的是 bash/sh 這一對兄弟的書,但是 csh/tcsh 這對兄弟的書也不少,你可以找出一堆這方面的書籍來學習,連網路上都有一堆這方面的教學文件,連中文的教學資料都有一大堆,全都不用錢。
就自動化而言,Unix 上早就有 at command,Windows 上的版本還是從 Unix 上 port 過去的。還有一套更好用的系統 ─ cron,更是目前的網管人員必須會的工具。簡單、易學、強大,是 cron 最大的特徵,要學會它,大概花你一個晚上就行了。
到了 Windows 2000/XP/2003 時,微軟終於又發揮把系統功能簡化成:你傻瓜、它聰明的境界,把 at 用 控制台→排定的工作 加以 GUI 簡化。但是最好的選擇仍是使用傳統的 DOS shell 或 VBscript shell 來寫作的腳本程式比較容易操控。如果我早已熟悉 Unix 下的 shell script 寫作,想讓 Cygwin 和它搭配,仍是有一段路要走的[2]。更重要的是它是系統管理專家最不信任的 GUI 介面,所以熟悉 Unix 的朋友,當看到 Cygwin 時,常常會想,是否能讓 Cygwin 也能執行 cron 呢?答案是肯定的,而且還不難呢。
首先我們先來聊聊怎麼安裝。先確認你是否事先已經不小心安裝過 cron 了,有三種確認方法:
第一種最笨,最直接,直接執行 setup.exe。
第二種方法是執行 Cygwin ,輸入
$ ls /usr/sbin/cron
如果出現的是:
ls: /usr/sbin/cron: No such file or directory
那麼就是沒有安裝,否則就會出現 cron 這個檔案。
第三種方法是在 Cygwin 中,輸入
$ ls /etc/setup | grep cron
如果空無一物,那就沒裝,不然就會出現 cron.lst.gz。這個第三種方法最正式,因為 /etc/setup 儲存的就是已安裝軟體的一些套件資料,你所有安裝過的套件在這裡都找得到它的 .lst.gz 檔。
本文需要的是 cron 和 cygrunsrv 這兩個套件。如果之前你曾經參考 在 Windows 上安裝 sshd,那麼應該已經裝過 cygrunsrv 。至於 cron 套件的安裝過程,請先參考 新增 Cygwin 上的軟體 ─ 以安裝 joe 和 rxvt 為例 一文,在 Cygwin 上安裝新軟體的方法是相同的。當出現如下圖的 Select Packages 對話方塊時,請按下 Admin 類別前的 + 號,把它打開,如下圖點選安裝 cron,也順便確認一下位在其下的 cygrunsrv 是否要升級,若要,請在此刻順便把它裝起來,不過這個動作應該是不用勞駕你動手,setup 程式會自動將它加上去。
由於 cron 本身是 Unix daemon,是需要在機器開機時,就立刻執行。在 在 Windows 上安裝 sshd 一文中,我曾經談過這需要使用 cygrunsrv 這個工具。使用這個工具,可以讓你的程式[3]以 Windows 的 service[4] 形式在 Windows 啟動時自動啟動,就宛若 Unix 上的 daemon 一樣。如果你想要知道 cygrunsrv 這個工具如何使用,請在 Cygwin 下輸入:
$ cygrunsrv --help
所以,我們必須先執行 sygrunsrv。我建議的執行參數是:
$ cygrunsrv --install cron --desc 'Cygwin cron daemon' --path /usr/sbin/cron.exe --args -D
你可以自行到 控制台→系統管理工具→服務,打開 服務 對話方塊,去確認是否有 cron 這項服務出現,然後看它是否已 啟動,也確認一下 啟動類型 是不是 自動。如果你想讓 啟動類型 使用 手動 類型,那麼執行的參數請再加上 --type manual 這項。我介紹一下上面命令的參數所代表的意義。--install 項目是 服務 的真正名稱,將來你要手動執行 服務 時,就是直接打這個名字。--desc 就是在 服務 對話方塊中 描述 這一列會顯示的內容,所以可有可無。只是要注意,如果文字間有空白字元,記得要用單引號括起來。--path 是真正要執行的程式命令。請注意,程式的路徑要用完整的,不能參考 $PATH。--args 就是你執行的命令它本身要帶的參數。在這裏,因為我們要讓 cron 成為 deamon 在背景寂靜執行,所以需要用到 cron -D 這樣的命令,因此要把 -D 這樣的參數放到 --args 項目中。我再補充一下 --disp 這個參數,這個參數指的是在 服務 對話方塊中 名稱 這一列會顯示的內容。但是,它只是顯示出來的名稱,並非 服務 本身真正的名字,所以在使用 net start ... 、net stop ... 這些有關 服務 的指令時不是用這個名稱,而是在 --install 後指定的那個真的的名字。但是如果不喜歡在 服務 對話方塊中 名稱 這一列只看到呆呆的 cron 這個字,那麼你可以使用 --disp 這個參數,比如說 --disp 'Cygwin cron' ,在 服務 對話方塊中 名稱 這一列列出來的就會變成 Cygwin cron,這樣看起來是不是清楚很多?
如果你想把 cron 服務除掉,那麼可以輸入:
$ cygrunsrv --remove cron
這樣不難吧。
剛才你在 服務 對話方塊中應該看到 cron 目前的狀態應該是空白的,也就是停止的。要啟動 cron,可以直接在 服務 對話方塊中,點選 cron 該列後,到上方工具列中按下 啟動服務 的圖示,它是一個黑色向右的三角形,和 CD 唱盤、錄音機上的 Play 鍵一樣。你也可以在 Cygwin 中輸入下列之一的命令,一樣可以啟動 cron service:
$ cygrunsrv -- start cron 或者
$ net start cron
停止它是:
$ cygrunsrv -- stop cron 或者
$ net stop cron
在之前 在 Windows 上安裝 sshd 一文中應該就看過相同的方法啟動 sshd。要確定它執行了沒,可以在 Cygwin 中執行:
$ ps -ef | grep cron
SYSTEM 4068 3724 ? 18:53:55 /usr/sbin/cron
或者
$ ps -a | grep cron
4068 3724 4068 3920 ? 18 18:53:55 /usr/sbin/cron
如果出現這樣,那就是執行起來了。要確定工作是否正確,你可以先加入一條工作:
$ crontab -e
* * * * * /usr/bin/date >> /tmp/hahaha
上面這一條是代表每一分鐘 cron 執行一次 date 指令,顯示當時的時間,然後把該時間加到 /tmp/hahaha 這個檔的後面。你可以在幾分鐘後自行用 cat /tmp/hahaha,看看是否正常執行。
$ cat /tmp/hahaha
Fri Apr 14 20:19:00 2006
Fri Apr 14 20:20:00 2006
Fri Apr 14 20:21:00 2006
Fri Apr 14 20:22:00 2006
如果你對 cron 不熟悉,請參考 Newbie: Intro to cron,該文相當詳細的一步一步解說得極為清楚,是很好的教學文件。