2015年8月5日 星期三

getopt() 教學

一篇還蠻完整的教學文章

http://wen00072-blog.logdown.com/posts/171197-using-getopt-parse-command-line-parameter

http://wen00072.github.io/blog/categories/getopt/

2015年5月24日 星期日

[yum] 查看某個套件所有相依的rpm

有時候在公司會因為一些資安政策,

導致在安裝環境時無法連上Internet,

這時候就必須要事先下載好所有的rpm包,

採用離線安裝的方式,

然而rpm最麻煩的就是套件相依性,

我們可以使用以下指令,

來查出某個套件所需要的全部rpm包,

舉例來說,假設我們今天要離線安裝gcc compiler,

可以用

repoquery --requires --resolve gcc

或是

yum deplist gcc

來查詢gcc相依的所有rpm,

上網下載完後,將這些rpm複製到無法連外的機器上,

使用 rpm -ivh *.rpm ,

就能完成安裝gcc compiler了。







2015年5月10日 星期日

[cronjob] 排程注意事項 - 檢查前一次的排程工作是否已結束

最近在寫日常排程的Script,

注意到排程工作(cronjob) 如果要穩定執行不出問題,

有個特別要處理的細節,

    就是「每當排程一啟動時,如何判斷前一次排程工作是否還在執行」

如果前一次排程工作尚未做完,

一般來說我們會希望這次啟動的排程不做任何事就直接結束,

以避免同時有2個排程對同個檔案做處理 ,

執行結果彼此覆蓋,導致錯誤發生。

此外檢查前一次排程是否存在最大的優點在於

    我們不用假設排程工作完成所需要的時間,就算排程間的間格設定為1分鐘啟動一次, 也能很安全的執行,一次只會有一個排程執行。

判斷前一次排程工作是否還在執行

可以使用以下指令來判斷:

    $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`;

第一眼看到會覺得很複雜,

沒關係,讓我們一步步拆解這條指令,

首先, 

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
#列出所有的套件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 gcc
http://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