一篇還蠻完整的教學文章
http://wen00072-blog.logdown.com/posts/171197-using-getopt-parse-command-line-parameter
http://wen00072.github.io/blog/categories/getopt/
2015年8月5日 星期三
2015年5月24日 星期日
[yum] 查看某個套件所有相依的rpm
有時候在公司會因為一些資安政策,
導致在安裝環境時無法連上Internet,
這時候就必須要事先下載好所有的rpm包,
採用離線安裝的方式,
然而rpm最麻煩的就是套件相依性,
我們可以使用以下指令,
來查出某個套件所需要的全部rpm包,
舉例來說,假設我們今天要離線安裝gcc compiler,
可以用
repoquery --requires --resolve gcc
或是
yum deplist gcc
或是
yum deplist gcc
來查詢gcc相依的所有rpm,
上網下載完後,將這些rpm複製到無法連外的機器上,
使用 rpm -ivh *.rpm ,
就能完成安裝gcc compiler了。
上網下載完後,將這些rpm複製到無法連外的機器上,
使用 rpm -ivh *.rpm ,
就能完成安裝gcc compiler了。
2015年5月10日 星期日
[cronjob] 排程注意事項 - 檢查前一次的排程工作是否已結束
最近在寫日常排程的Script,
注意到排程工作(cronjob) 如果要穩定執行不出問題,
此外檢查前一次排程是否存在最大的優點在於
$process_num = `ps aux | awk '{for(i=11;i<=NF;i++) {printf("%s",\$i OFS);} printf("%s", ORS);}' | egrep "^$cmd" | wc -l`;
這邊的$cmd是我們要抓取的排程指令,
假設我們的排程是run.sh,
則上面的指令就改成:
$process_num = `ps aux | awk '{for(i=11;i<=NF;i++) {printf("%s",\$i OFS);} printf("%s", ORS);}' | egrep "^run.sh" | wc -l`;
第一眼看到會覺得很複雜,
有個特別要處理的細節,
就是「每當排程一啟動時,如何判斷前一次排程工作是否還在執行」
如果前一次排程工作尚未做完,
一般來說我們會希望這次啟動的排程不做任何事就直接結束,
以避免同時有2個排程對同個檔案做處理 ,
執行結果彼此覆蓋,導致錯誤發生。
此外檢查前一次排程是否存在最大的優點在於
我們不用假設排程工作完成所需要的時間,就算排程間的間格設定為1分鐘啟動一次, 也能很安全的執行,一次只會有一個排程執行。
判斷前一次排程工作是否還在執行
可以使用以下指令來判斷:
假設我們的排程是run.sh,
則上面的指令就改成:
$process_num = `ps aux | awk '{for(i=11;i<=NF;i++) {printf("%s",\$i OFS);} printf("%s", ORS);}' | egrep "^run.sh" | wc -l`;
沒關係,讓我們一步步拆解這條指令,
首先,
ps aux 是用來取得目前所有執行的process,
執行結果如下圖:
接著 ps aux | awk '{for(i=11;i<=NF;i++) {printf("%s",$i OFS);} printf("%s", ORS);}'
你會發現輸出結果只剩下COMMAND這一欄了,
那這個awk是拿來幹嘛的勒,
awk是個字串處理的指令,
他會將一行字串根據空白或tab做切割,
並輸出第n格的字串,
例如:
我們有一行字串是 "Jack 3345678 jack@domain.com"
此時awk會切割成3個字串,並存在一個陣列
arr[0]="Jack 3345678 jack@domain.com"
arr[1]="Jack"
arr[2]="3345678"
arr[3]="jack@domain.com"
有趣的地方是陣列的第0個是存放原始字串的內容,
切割的內容從1開始數,
如果只要輸出第1格和第2格的內容,
則寫成如下指令:
echo "Jack 3345678 jack@domain.com" | awk '{printf("%s",$1 ORS $2 ORS);}'
這邊的$2用來指定第2格,ORS代表換行符號,OFS代表空白,
而 awk '{for(i=1;i<=2;i++) {printf("%s",$i OFS);} printf("%s", ORS);}
是上述指令的進階版,
等同於awk '{printf("%s",$1 OFS $2 ORS);}'。
最後就是用egrep抓出我們要檢查的排程指令,
為何用egrep而不是grep,
原因在於grep會抓出所有包含run.sh的字串
因此以下字串都會被grep抓出來
a_run.sh
xx_run.sh
為了防止這種情況發生,
我們使用egrep搭配正則表達式(regular expression)抓出run.sh開頭的所有字串,
執行結果如下(抓出所有/usr/sbin開頭的process):
配合wc -l 指令,算出egrep的抓取結果有幾行,
以/usr/sbin為例,可以找到14個以/usr/sbin開頭的process,
以上是針對
$process_num = `ps aux | awk '{for(i=11;i<=NF;i++) {printf("%s",\$i OFS);} printf("%s", ORS);}' | egrep "^$cmd" | wc -l`;
的完整說明。
[結論]
(1)可以利用ps aux搭配awk, egrep, wc來抓出前一次排程是否執行完成。
(2)檢查前一次排程是否存在最大的優點在於
- 我們不用假設排程工作完成所需要的時間,就算排程間的間格設定為1分鐘啟動
一次,也能很安全的執行,一次只會有一個排程執行。
2015年5月8日 星期五
[yum] rpm 常用指令
Google關鍵字:rpm 參數
http://achuan.blog.51cto.com/102/60869
http://reader.roodo.com/thinkingmore/archives/553819.html
http://linux.ximizi.com/linux/4/31195.html
http://man.linuxde.net/yum
http://achuan.blog.51cto.com/102/60869
http://reader.roodo.com/thinkingmore/archives/553819.html
#列出所有的套件group yum group list #查詢有gcc關鍵字的rpm包 yum search gcc #安裝本地端上的rpm包 yum localinstall /home/rhythmbox-3.0.3-1.fc20.i686.rpm #顯示這台機器上所有已安裝過的套件 rpm -qa #顯示gcc隸屬哪些群組 repoquery --groupmember gcchttp://man.linuxde.net/rpm
http://linux.ximizi.com/linux/4/31195.html
http://man.linuxde.net/yum
#列出'Development Tool'群組的資訊 yum group info 'Development Tool' #安裝所有屬於'Development Tool'群組的套件 yum group install 'Development Tool' #移除所有屬於'Development Tool'群組的套件 yum group remove 'Development Tool' yum info gcc #顯示gcc套件的相關資訊 yum install gcc #安裝gcc套件 yum remove gcc #移除gcc套件 yum deplist gcc #顯示gcc套件的所有相依套件,很好用 #顯示gcc套件的所有相依套件,有點難記 repoquery --requires --resolve gcc #列出非重複的相依套件 yum deplist gcc | grep provider | sort | uniq #顯示gcc這個套件安裝了哪些東西,很好用 rpm -ql gcc #顯示/usr/bin/bash這個檔案隸屬哪個安裝包 rpm -qf /usr/bin/bash
訂閱:
文章 (Atom)