linux實現任務自動化大體可以分兩類,系統初始化時運行和定時運行。對於定時運行linux內建了兩種工具,crontab和at。
關於crontab的介紹,有兩篇比較靠譜的文章:計劃任務工具 cron 的配置和說明、linux下實行計劃任務。
at的介紹相對較少,稍微說下:
- 使用at.allow和at.deny進行存取控制,/etc/at.allow包括被授權訪問的使用者,/etc/at.deny包括不可使用at的使用者。如果兩個檔案都不存在,只有超級使用者可以使用。預設的at.deny是空白狀態,也就是允許所有使用者。
- 如何指定已耗用時間,很靈活,舉幾個簡單的例子。at now 立即運行
at now + 2 minutes 2分鐘後運行
at 16:00 當天下午4點運行
at 16:00 明天下午4點
- 提交任務的方式兩種。// 指定檔案提交
$ at -f /root/bin/runme now + 5 hours// 標準輸入提交
$ at 23:40
at> cd /tmp/perl
at> make
at> ls -al > tmp.log
at> <Ctrl-d>
- 查看任務atq和at -l等效,刪除任務at -d 任務序號。
碰到的問題,如果計劃任務啟動的指令碼需要java環境支援:
- 可以在/etc/profile中設定JAVA_HOME等變數,這個指令碼是全域的,在系統啟動時會完全載入,/etc/bashrc優先順序較低,JAVA_HOME設定在這對計劃任務不起作用,因為crontab的運行是不需要console的。
- 可以在任務指令碼中重新設定,前提你在/etc/bashrc中設定了環境變數。$ source /etc/bashrc
- 計劃任務需要介面支援的話,需要配置DISPLAY變數,附帶一句廢話,注意大小寫。$ export DISPLAY=:1.0
兩種方式得到當前DISPLAY
$ echo $DISPLAY
$ printenv | fgrep DISPLAY
- 以上的環境變數應該都可在/etc/crontab中設定,能不能生效就需要自己嘗試了。