日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

標(biāo)準(zhǔn)化您的 UNIX 命令行工具( 三 )


在 Solaris 上,killall 命令存在,但是將其用作關(guān)閉過程的一部分以終止所有進(jìn)程 。設(shè)想在 Solaris 主機(jī)上意外調(diào)用 killall 命令以關(guān)閉所有 Apache 進(jìn)程,沒想到卻實(shí)際上關(guān)閉了系統(tǒng)!
提供替代——在所有主機(jī)上使用相同的名稱或使用不同的名稱——可以實(shí)現(xiàn)按名稱終止進(jìn)程的預(yù)期結(jié)果,并消除不希望的和可能代價(jià)高昂的錯(cuò)誤,同時(shí)擴(kuò)展本身并不支持該選項(xiàng)的系統(tǒng)的功能 。
該命令的關(guān)鍵部分是能夠識別正在運(yùn)行的進(jìn)程,提取與給定字符串匹配的進(jìn)程,并使用 kill 命令將 KILL 信號發(fā)送到每個(gè)匹配進(jìn)程 。在命令行上,您可以通過一系列管道實(shí)現(xiàn)等效的功能(使用 KILL 信號),如清單 5 所示 。
清單 5. 提供 killall 命令的替代
$ ps -ef|grep gcc|awk '{ print $2; }'|xargs kill -9
該命令的關(guān)鍵部分是提供給 grep(在此示例中為 gcc)的字符串和 ps 輸出中包含所需進(jìn)程 ID 的列 。上面的例子對 Solaris 主機(jī)和大多數(shù) SVR4 Unix 變種有效 。
別名在此示例中無法工作,因?yàn)槟M軌虿迦朊钪械男畔⒉辉诮Y(jié)尾;別名所實(shí)現(xiàn)的是一種展開方法 。然而,內(nèi)聯(lián)外殼函數(shù)正好適合這種情況 。
【標(biāo)準(zhǔn)化您的 UNIX 命令行工具】在支持 Bourne 語法(bash 和 zsh)的外殼中,您可以使用清單 6 所示的以下語法來定義函數(shù) 。
清單 6. 定義函數(shù)
function NAME()
{
# do stuff here
}
調(diào)用函數(shù)時(shí),函數(shù)參數(shù)作為 $1、$2 等形式來提供,就像在典型的外殼腳本中一樣 。因此,您可以定義一個(gè)函數(shù),使其執(zhí)行與 killall 相同的基于字符串的信號發(fā)送功能(請參見清單 7) 。
清單 7. 定義一個(gè)執(zhí)行與 killall 相同的信號發(fā)送功能的函數(shù)
function killall()
{
ps -ef|grep $1|awk '{ print $2; }'|xargs kill -9
}
請注意,該函數(shù)的 awk 部分中的 $2 不會展開,因?yàn)槟呀?jīng)對 awk 腳本定義使用了單引號,這樣阻止了展開,并且在此示例中會挑選第二列 。
與別名一樣,指定外殼函數(shù)的最佳位置是在外殼的初始化腳本中 。函數(shù)的局限性在于,它們依賴外殼提供支持能力,而這并不總是可能或可用 。
雖然可以隨心所欲地使內(nèi)聯(lián)外殼函數(shù)變得任意長,但在許多情況下,外殼函數(shù)并不理想 。例如,在模擬更復(fù)雜的命令或提供命令包裝的超長序列中,您需要分析選項(xiàng)并提供本地化的等效命令,此時(shí)內(nèi)聯(lián)函數(shù)就沒有多大用處了 。在這種情況下,外殼腳本可能更為適合 。
使用腳本
構(gòu)建一致環(huán)境的最容易和最兼容的方法,是創(chuàng)建可用作實(shí)際命令的包裝的外殼腳本,這樣考慮了您希望支持的各種選項(xiàng)和設(shè)置 。
例如,useradd 和 adduser 命令在設(shè)置參數(shù)(如用戶 ID 或組成員資格)時(shí)支持同樣的單字母命令行選項(xiàng),因此 Linux 上的 $ adduser -u 1000 -G sales,marketing mcbrown 等效于 Solaris 上的 $ useradd -u 1000 -G sales,marketing mcbrown 。
然而,Linux 版本還支持?jǐn)U展命令選項(xiàng),例如,--uid 和 --groups 等效于上面的命令行選項(xiàng) 。這些擴(kuò)展選項(xiàng)在 Solaris 上不受支持,但是,如果創(chuàng)建一個(gè)名為 adduser 的外殼腳本,您就可以模擬 Linux 版本,然后用適當(dāng)?shù)倪x項(xiàng)運(yùn)行實(shí)際的 Solaris useradd 命令 。
清單 8 是用作 adduser 或 useradd 命令的包裝的示例外殼腳本 。
清單 8. 用作包裝的示例外殼腳本
#!/bin/bash
# -*- shell-script -*-
for i in $*
do
 case $i in
 --uid|-u) OPT_UID=$2; shift 2;;
 --groups|-G) OPT_GROUPS=$2; shift 2;;
 --gid|-g) OPT_GROUP=$2; shift 2;;
 --home-dir|-d) OPT_HOMEDIR=$2; shift 2;;
 --shell|-s) OPT_SHELL=$2;shift 2;;
 --non-unique|-o) OPT_NONUNIQUE=1;shift 2;;

推薦閱讀