1 Linux系統定時任務
1.1 定時任務介紹
1.1.1 Crond是什么?
Crond是linux系統中用來定期執行命令或指定程序任務的一種服務或軟件。Centos5/6 linux系統安裝完操作系統默認會啟動crond任務調度服務,系統開機啟動優化保留crond服務開機自啟動。
Crond服務定期(默認是每分鍾檢查一次)檢查系統中是否有要執行的任務工作。這個crond定時任務服務就相當於我們平時使用的鬧鍾一樣。特殊需求:(秒級別)crond服務搞不定了,工作中一般寫腳本守護程序執行。
1.1.2 程序文件和進程說明
程序文件:程序代碼組成,但是沒有在計算機內執行,即當前沒有執行
進程:所謂的進程就是計算機中正在執行的程序
守護程序或守護進程:守護進程就是一直運行的程序(linux運行必須要啟動的程序)
操作命令:
#linux優化內容,保留sshd|network|rsyslog|crond|sysstat這五個服務 [root@oldboy oldboy]# chkconfig --list | grep "3:on" | grep -Ev "sshd|network|rsyslog|crond|sysstat" | awk '{print "chkconfig",$1,"off"}'| bash #查看linux系統當前正在運行的服務 [root@oldboy oldboy]# chkconfig --list | grep "3:on" crond 0:off 1:off 2:on 3:on 4:on 5:on 6:off network 0:off 1:off 2:on 3:on 4:on 5:on 6:off rsyslog 0:off 1:off 2:on 3:on 4:on 5:on 6:off sshd 0:off 1:off 2:on 3:on 4:on 5:on 6:off sysstat 0:off 1:on 2:on 3:on 4:on 5:on 6:off
1.1.3 不同系統定時任務的分類
windows 7 系統的定時任務
開始→所有程序→附件→系統工具→選擇任務計划程序
Linux系統的定時任務
Linux系統中定時任務調度的工作可以分為以下兩種情況:
1、linux系統自身定期執行的任務工作:系統周期性自動執行的任務工作,如輪詢系統日志、備份系統數據、清理系統緩存等,這些任務無需我們人為干預,例如:
[root@oldboy mail]# ls -l /var/log/messages* ->系統日志 -rw------- 1 root root 416686 Apr 30 12:41 /var/log/messages -rw------- 1 root root 403072 Apr 9 19:41 /var/log/messages-20180409 -rw------- 1 root root 604646 Apr 14 19:15 /var/log/messages-20180415 -rw------- 1 root root 546051 Apr 22 01:00 /var/log/messages-20180422 -rw------- 1 root root 719102 Apr 29 15:06 /var/log/messages-20180429 [root@oldboy mail]# ls -l /var/log/secure* ->安全日志 -rw------- 1 root root 8957 Apr 30 12:41 /var/log/secure -rw------- 1 root root 7237 Apr 9 20:31 /var/log/secure-20180409 -rw------- 1 root root 21111 Apr 15 01:32 /var/log/secure-20180415 -rw------- 1 root root 11403 Apr 22 01:06 /var/log/secure-20180422 -rw------- 1 root root 15812 Apr 29 16:11 /var/log/secure-20180429
說明:像這樣的工作是由系統自身來完成的,不需要系統管理員來設置
系統自動輪詢任務的設置配置路徑:
[root@oldboy mail]# ls -l /etc/ | grep "cron" -rw-------. 1 root root 541 Nov 23 2013 anacrontab drwxr-xr-x. 2 root root 4096 Mar 24 21:40 cron.d drwxr-xr-x. 2 root root 4096 Mar 24 21:40 cron.daily -rw-------. 1 root root 0 Nov 23 2013 cron.deny drwxr-xr-x. 2 root root 4096 Mar 24 21:39 cron.hourly drwxr-xr-x. 2 root root 4096 Mar 24 21:40 cron.monthly drwxr-xr-x. 2 root root 4096 Sep 27 2011 cron.weekly -rw-r--r--. 1 root root 457 Sep 27 2011 crontab [root@oldboy mail]# cd /etc/logrotate.d/ [root@oldboy logrotate.d]# ls dracut httpd psacct syslog vsftpd yum [root@oldboy logrotate.d]# vim syslog /var/log/cron /var/log/maillog /var/log/messages /var/log/secure /var/log/spooler { sharedscripts postrotate /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true endscript } ~ 設置文件:/etc/logrotate.conf
2、用戶執行的任務工作:某個用戶或系統管理員定期要做的任務工作,例如每隔5分鍾和互聯網上時間服務器進行時間同步(安裝系統基礎優化部分內容),每天晚上0點備份網站站點數據及數據庫數據,一般這些工作需要由每個用戶自行設置才行(linux系統管理員)
[root@oldboy ~]# which ntpdate ->查看ntpdate二進制命令所在路徑 /usr/sbin/ntpdate [root@oldboy ~]# ps -ef | grep ntpdate root 3276 2534 0 16:06 pts/3 00:00:00 grep --color=auto ntpdate [root@oldboy ~]# crontab -l |tail -2 #time sync by Wolf_Dreams 2018-05-01 */5 * * * * /usr/sbin/ntpdate time1.aliyun.com > /dev/null 2>&1 補充說明(阿里雲公共NTP服務器): 1) Unix類系統:time1-7.aliyun.com 2) Windows: time.pool.aliyun.com
1.2 定時任務crond使用說明
1.2.1 Crontab命令語法(標黃代表常用選項參數)
名稱描述: crontab - maintain crontab files for individual users 使用格式: crontab [-u user] file crontab [-u user] [-l | -r | -e] [-i] [-s] 選項參數說明: -u 指定用戶名 -e 使用編輯器創建定時任務 -l 顯示目前設置的定時任務 -r 刪除定時任務 -i 刪除定時任務給出確認是否刪除的提示信息 -s selinux security context
1.2.2 Crontab指令說明
通過crontab我們可以在固定的間隔時間執行指定的系統指令或script腳本。時間間隔的單位是分鍾,小時,日,月,周及以上的任意組合(注意:日和周不要組合)
1.2.3 Crontab配置文件默認存放目錄
文件 |
說明 |
/var/spool/cron |
所有用戶crontab配置文件默認都存放在此目錄,文件名以哪個用戶創建定時任務就以哪個用戶名命名 ^_^ [root@oldboy cron]# cat /var/spool/cron/root #echo + oldboy.log file by wolf_dreams 2018-05-01 #*/1 * * * * echo "+" > /root/oldboy/oldboy.log ####tar ***/etc/services 00 */2 * * * /bin/sh /root/oldboy/backup_service.sh > /dev/null 2>&1 ###tar /var/www/html file /data #00 00 * * * /bin/sh /root/oldboy/backup_html.sh > /dev/null 2>&1 ###remove /data directory *.tar.gz files 00 00 * * * /bin/sh /root/oldboy/remove_backup.sh > /dev/null 2>&1 #time sync by Wolf_Dreams 2018-05-01 */5 * * * * /usr/sbin/ntpdate time1.aliyun.com > /dev/null 2>&1 通過crontab查看或編輯的定時任務規則默認都會放到/var/spool/cron/目錄下,以當前用戶命令的文件 |
/etc/cron.deny |
定時任務也可以針對普通用戶設置,可以在/etc/cron.deny設置禁止執行定時任務的用戶(即不允許使用crontab命令) |
補充說明: [root@oldboy ~]# crontab -e === vi /var/spool/cron/root [root@oldboy ~]# crontab -l === cat /var/spool/cron/root |
1.2.4 crontab指令選項說明含義表
參數 |
含義 |
指定示例 |
-l(字母) |
查看crontab文件內容,可理解成list縮寫 |
crontab -l |
-e |
編輯crontab文件內容,可理解成edit的縮寫 |
crontab -e |
-i |
刪除crontab文件內容,刪除前會提示確認,很少用 |
crontab -ri |
-r |
刪除crontab文件內容,很少用 |
crontab -r |
-u user |
指定使用用戶執行定時任務 |
crontab -u gandalf -l |
提示:crontab{-l |-e}實際上就是在操作/var/spool/cron/當前用戶這樣的文件 |
特別提醒(兩個特殊配置文件的對比說明):
crontab -e |
/var/spool/cron/root |
crontab –e編輯會檢查語法,而直接使用echo,vi編輯配置不會檢查語法 |
visudo |
/etc/sudoers |
visudo編輯會檢查語法,而直接使用echo,vi編輯配置不會檢查語法 |
說明:有些人可能會直接編輯/etc/crontab配置文件來設置定時任務,沒有必要使用這種配置方法,來配置定時任務,例子如下:
[root@oldboy ~]# cat /etc/crontab SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ # For details see man 4 crontabs # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed
1.2.5 crontab指令使用格式
默認情況下,當用戶建立定時任務規則后,該規則記錄對應的配置文件會存在於/var/spool/cron中,其crontab配置文件對應的文件名與登錄的用戶名一致,如:root用戶的定時任務配置文件為/var/spool/cron/root。
crontab定時任務的書寫格式很簡單,用戶的定時任務規則一般分為6個段(每個段通過空格來分隔,系統的定時任務為/etc/crontab,分為7段,空格來分隔),前五段為時間的設定段,第六段為所要執行的命令或腳本任務段
用戶定時任務基本格式如下:
01 * * * * cmd 02 4 * * * cmd 22 4 * * 0 cmd 42 4 1 * * cmd 分 時 日 月 周 任務
1.2.6 crontab語法格式中時間段的含義
段 含義 取值范圍(整數) 第一段 代表分鍾 00-59 第二段 代表小時 00-23 第三段 代表日,天 01-31 第四段 代表月份 01-12 第五段 代表星期,周幾 0-7(0和7都代表星期日) 提示:時間記憶口訣:分時日月周,取值范圍:正常日期時間范圍
1.2.7 crontab語法格式中特殊符號的含義
特殊符號 |
含義 |
* |
*號表示任意時間都,就是“每”的意思,舉例:如00 01 * * * cmd表示每月每周每日的凌晨1點執行cmd任務。 |
- |
減號,表示分隔符,表示一個時間范圍段,如17-19點,每小時的00分執行任務。00 17-19 * * * cmd。就是17,18,19點整點分別執行的意思。 |
, |
逗號,表示分隔時間段的意思。30 17,18,19 * * * cmd 表示每天17,18,19點的半點執行cmd。也可以和“-”結合使用,如: 30 3-5,17-19 * * * cmd。 |
/n |
n代表數字,即”每隔n單位時間”,例如:每10分鍾執行一次任務可以寫 */10 * * * * cmd,其中 */10,*的范圍是0-59,也可以寫成0-59/10。 |
1.2.8 Crontab編輯定時任務依賴的服務
[root@oldboy ~]# chkconfig --list crond crond 0:off 1:off 2:on 3:on 4:on 5:on 6:off [root@oldboy ~]# /etc/init.d/crond status crond (pid 1412) is running... [root@oldboy ~]# ps -ef | grep crond | grep -v grep root 1412 1 0 10:29 ? 00:00:00 crond [root@oldboy ~]# /etc/init.d/crond restart Stopping crond: [ OK ] Starting crond: [ OK ] 提示:安裝完Centos系統后開機啟動任務優化,要保留crond定時任務的服務
1.3 定時任務crond案例
示例一:
30 3,12 * * * /bin/sh /scripts/oldboy.sh 本例中,第一列為30,表示30分鍾,第二列為3,12,表示凌晨3點及中午12點,此定時任務的意思是每天凌晨3點和中午12點的半點時刻(或每天凌晨3:30和中午12:30)執行/scripts/oldboy.sh腳本
示例二:
30 */6 * * * /bin/sh /scripts/oldboy.sh 本例中,第一列為30,表示30分鍾,第二列為*/6,表示每6個小時,也相當於6,12,18,24的作用,此定時任務的意思是每隔6個小時的半點時刻執行/scripts/oldboy.sh腳本
示例三:
30 8-18/2 * * * /bin/sh /scripts/oldboy.sh 本例中,第一列為30,表示30分鍾,第二列為8-18/2,表示從早上8點到下午18點之間每隔2個小時,也相當於8,10,12,14,16,18單獨列出的作用,此定時任務的意思是早上8點到下午18點之間
每隔2個小時的半點時刻執行/scripts/oldboy.sh腳本
示例四:
30 21 * * * /etc/init.d/httpd restart 本例中表示每晚的21:30重啟apache服務
示例五:
45 4 1,10,22 * * /etc/init.d/httpd restart 本例中表示每月1、10、22日的凌晨4:45分重啟apache服務
示例六:
10 1 * * 6,0 /etc/init.d/httpd restart 本例中表示每周六、周日的凌晨1:10分重啟apache服務
示例七:
0,30 18-23 * * * /etc/init.d/httpd restart 本例中表示每天18:00到23:00之間每隔30分鍾重啟apache服務 提示:最后一次執行任務的時間是23:30
示例八:
00 */1 * * * /etc/init.d/httpd restart 本例中表示每隔一個小時整點重啟apache服務
示例九(錯誤的定時任務寫法):
* 23,00-07/1 * * * /etc/init.d/httpd restart 本例中並不表示晚上23點和早上0-7點之間每隔一個小時重啟apache服務 提示:以上的結果是不規范的,也是不對的 以上的定時任務的第一列為*,表示每分鍾都執行任務即晚上23點和早上0-7點之間每隔一小時的每分鍾都重啟apache服務
示例十:
00 11 * 4 1-3 /etc/init.d/httpd restart 本例中表示表示4月的每周一到周三的上午11點整重啟apache服務 強調:周和日不要同時使用,否則可能達不到想要的效果
1.4 書寫crond定時任務7個基本要領
1.4.1 為定時任務規則添加必要的注釋
添加注釋就知道每一個定時任務運行的是什么作業,以防以后混亂,切記這個習慣和規范
[root@oldboy ~]# crontab -l #time sync by Wolf_Dreams 2018-05-01 */5 * * * * /usr/sbin/ntpdate time1.aliyun.com > /dev/null 2>&1
1.4.2 定時任務命令或程序最好寫到腳本里面執行
[root@oldboy ~]# crontab –l ###tar /var/www/html file /data 00 00 * * * /bin/sh /root/oldboy/backup_html.sh > /dev/null 2>&1
1.4.3 定時任務執行的腳本要規范路徑
[root@oldboy ~]# crontab –l ###tar /var/www/html file /data 00 00 * * * /bin/sh /root/oldboy/backup_html.sh > /dev/null 2>&1
1.4.4 執行shell腳本任務時前面加/bin/sh
執行定時任務時,如果是執行腳本,盡量在腳本前面加上/bin/sh(sh二進制命令的絕對路徑),否則有可能忘了為腳本設定執行權限,從而無法完成任務
[root@oldboy ~]# crontab –l ###tar /var/www/html file /data 00 00 * * * /bin/sh /root/oldboy/backup_html.sh > /dev/null 2>&1
1.4.5 定時任務結尾加> /dev/null 2>&1
[root@oldboy ~]# crontab –l ###tar /var/www/html file /data 00 00 * * * /bin/sh /root/oldboy/backup_html.sh > /dev/null 2>&1
1.4.5.1 有關/dev/null的說明
/dev/null為特殊的字符設備文件,表示黑洞設備或空設備
[root@oldboy ~]# ls -l /dev/null crw-rw-rw- 1 root root 1, 3 May 1 10:28 /dev/null
1.4.5.2 有關重定向的說明
>或1> 輸出重定向:把前面輸出的東西輸入到后邊的文件中,會刪除文件原有內容。 >>或1>>追加重定向:把前面輸出的東西追加到后邊的文件中,不會刪除文件原有內容。 <或<0 輸入重定向:輸入重定向用於改變命令的輸入,指定輸入內容,后跟文件名。 <<或<<0輸入重定向:后跟字符串,用來表示“輸入結束”,也可用ctrl+d來結束輸入。 2> 錯誤重定向:把錯誤信息輸入到后邊的文件中,會刪除文件原有內容。 2>> 錯誤追加重定向:把錯誤信息追加到后邊的文件中,不會刪除文件原有內容。 標准輸入(stdin):代碼為0,使用<或<<。 標准輸出(stdout):代碼為1,使用>或>>。正常的輸出。 標准錯誤輸出(sederr):代碼為2,使用2>或2>>。 特殊: 2>&1就是把標准錯誤重定向到標准輸出(>&)。 >/dev/null 2>&1 等價於 1>/dev/null 2>/dev/null
1.4.5.3 >/dev/null 2>&1的作用
如果定時任務規范結尾不加 >/dev/null 2>&1,很容易導致硬盤inode(索引節點)空間被占滿,會出現no space left on device提示信息,從而導致系統服務不正常(如果系統是centos 5版本默認安裝sendmail,
var/spool/clientmqueue郵件臨時隊列目錄,垃圾文件存放於此,如果系統是centos 6版本,默認不裝sendmail服務,但是默認安裝postfix服務且處於開啟狀態,垃圾文件存放目錄是:/var/spool/postfix
/maildrop) 提示:/var/spool/postfix/maildrop產生大量的垃圾小文件,是因為crond定時任務服務與郵件服務是相關聯的,執行定時任務要向定義定時任務的用戶發送郵件(郵件內容cron執行腳本中的output和warning信息),
當postfix服務處於關閉狀態的時候,cron服務發送郵件就發不出去,就會大量堆在/var/spool/postfix/maildrop目錄
Linux系統Centos6.5版本郵件服務(postfix,默認是開啟狀態):
[root@oldboy ~]# ps -ef | grep postfix | grep -v grep root 1348 1 0 10:29 ? 00:00:00 /usr/libexec/postfix/master postfix 1358 1348 0 10:29 ? 00:00:00 qmgr -l -t fifo -u postfix 2741 1348 0 14:17 ? 00:00:00 pickup -l -t fifo -u [root@oldboy ~]# lsof -i :25 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME master 1348 root 12u IPv4 11032 0t0 TCP localhost:smtp (LISTEN) master 1348 root 13u IPv6 11034 0t0 TCP localhost:smtp (LISTEN) [root@oldboy maildrop]# /etc/init.d/postfix status master (pid 1348) is running...
問題表現和檢查方法:
1、運行df –i查看inode空間使用是否滿了
[root@oldboy ~]# df -i Filesystem Inodes IUsed IFree IUse% Mounted on /dev/sda3 577088 53322 523766 10% / tmpfs 60785 1 60784 1% /dev/shm /dev/sda1 51200 38 51162 1% /boot /dev/sr0 0 0 0 - /mnt
2、查看/var/spool/postfix/maildrop/目錄是否有非常多的小文件,ls命令查看出現直接卡死等情況
[root@oldboy ~]# ls -l /var/spool/postfix/maildrop/
索引節點inode空間占滿的解決辦法:
第一種辦法:重啟postfix郵件服務,來釋放inode空間
[root@oldboy maildrop]# /etc/init.d/postfix restart Shutting down postfix: [ OK ] Starting postfix: [ OK ] 或者采用”vi /etc/crontab” 修改crontab定時任務配置文件 將‘MAILTO=root’替換成‘MAILTO=""’,然后service crond restart即可;如果還不行在crontab –e第一行直接增加MAILTO=""
第二種辦法:刪除/var/spool/postfix/maildrop目錄下的文件
[root@oldboy ~]# cd /var/spool/postfix/maildrop [root@oldboy maildrop]# ls | xargs rm –rf 或者使用find查找並刪除文件 [root@oldboy ~]# find /var/spool/postfix/maildrop/ -type f | xargs rm -rf
1.4.6 在指定用戶下執行相關定時任務
這里要特別注意不同用戶的環境變量問題,如果是調用了系統環境變量/etc/profile,最好在程序腳本中將用到的環境變量重新export下。
1.4.7 生產任務程序不要隨意打印輸出信息
在調試好腳本程序后,應盡量把DEBUG及命令輸出的內容信息屏蔽掉,如果確實需要輸出日志,可定向到日志文件里,避免產生系統垃圾。
1.4.8 配置定時任務規范操作過程
首先要在命令行操作成功,然后復制成功的命令到腳本里,在各個細小環境減少出錯的機會。
然后測試腳本,測試成功后,復制腳本的規范路徑到定時任務配置里,不要手敲。
先在測試環境下測試,然后正式環境規范部署。
1.5 生產場景如何調試crond定時任務
規范的公司開發和運維人員操作流程:個人的開發配置環境-->辦公室的測試環境-->idc機房的測試環境-->idc機房的正式環境(分組,灰度發布)
1.5.1 增加執行頻率調試任務
在調試時,把任務執行頻率調快,比如每分鍾或者系統時間之后5分鍾執行,看結果執行是否可以正確執行,如果正常,那就沒問題了,再改成需要的任務的執行時間
注意:有些任務時不允許頻繁執行的,例如:定時往數據庫里插入數據,這樣的任務要在測試機上測試好,然后正式線上出問題的機會就少了。
1.5.2 調整系統時間調試任務(不能直接用於生產環境)
用正確的執行任務的時間,設置完成后,可以修改下系統當前時間,改成任務執行時間的前幾分鍾來測試(或者重啟定時任務服務)
1.5.3 通過腳本日志輸出調試定時任務
在腳本中加入日志輸出,然后把輸出打到指定的日志中,然后觀察日志內容的結果,看是否正確執行,如下面例子中標綠部分/tmp/crontab.log(腳本日志) [root@oldboy ~]# crontab -l #time sync by Wolf_Dreams 2018-05-01 */5 * * * * /usr/sbin/ntpdate time1.aliyun.com > /tmp/crontab.log
1.5.4 注意一些任務命令帶來的問題
注意: */1 * * * * echo "+" > /root/oldboy/oldboy.log >/dev/null 2>&1這里隱藏的無法正確執行的任務配置,原因是前面多了>,或者去掉結尾的 >/dev/null 2>&1
(定時任務中重定向輸出只能使用一次,不能使用兩次或多次) 正確寫法: [root@oldboy ~]# crontab -l #echo + oldboy.log file by wolf_dreams 2018-05-01 */1 * * * * echo "+" > /root/oldboy/oldboy.log 錯誤寫法: [root@oldboy ~]# crontab -l #echo + oldboy.log file by wolf_dreams 2018-05-01 */1 * * * * echo "+" > /root/oldboy/oldboy.log > /dev/null 2>&1
1.5.5 注意環境變量導致的定時任務故障
在調試java程序任務的時候,注意環境變量,把環境變量的定義加到腳本里 例子: [root@oldboy oldboy]# cat /root/oldboy/task.sh #!/bin/bash JAVA_HOME="/opt/jdk1.6.0_18" CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar PATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:/opt/nginx-0.7.61/sbin:/opt/jdk1.6.0_18/bin:/opt/resin-3.0.25/bin:$PATH export JAVA_HOME PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC CLASSPATH /usr/local/bin/xxresin_stop.sh /usr/local/bin/xxresin_start.sh
1.5.6 通過定時任務日志調試定時任務
[root@oldboy ~]# tail -f /var/log/cron May 1 21:45:40 oldboy crontab[3835]: (root) END EDIT (root) May 1 21:46:01 oldboy crond[3505]: (root) RELOAD (/var/spool/cron/root) May 1 21:46:01 oldboy CROND[3838]: (root) CMD (echo "+" > /root/oldboy/oldboy.log) May 1 21:47:01 oldboy CROND[3840]: (root) CMD (echo "+" > /root/oldboy/oldboy.log) May 1 21:47:26 oldboy crontab[3841]: (root) BEGIN EDIT (root) May 1 21:48:01 oldboy CROND[3844]: (root) CMD (echo "+" > /root/oldboy/oldboy.log) May 1 21:49:01 oldboy CROND[3846]: (root) CMD (echo "+" > /root/oldboy/oldboy.log) May 1 21:50:01 oldboy CROND[3850]: (root) CMD (/usr/sbin/ntpdate time1.aliyun.com > /dev/null 2>&1) May 1 21:50:01 oldboy CROND[3852]: (root) CMD (echo "+" > /root/oldboy/oldboy.log) May 1 21:50:01 oldboy CROND[3853]: (root) CMD (/usr/lib64/sa/sa1 1 1)
1.5.7 sh -x 調試腳本
[root@oldboy oldboy]# sh -x sh-4.1# sh-4.1# exit [root@oldboy oldboy]#