2013-11-02 37 views
0

我有以下的Z shell腳本來啓動一個程序的實例,如果一個程序還沒有被主動運行,即使有殭屍實例,或者恢復一個停止的實例。我覺得必須有更好的方式來使用,也許使用perl。 shell腳本看起來太尷尬 - 至少應該可以從另一種語言(如perl或awk)進行文本操作。我該如何替換這個shell腳本?

launchprogram(){ 
if [ $# = 0 ] 
then 
    cat <<\EOF 
launchprogram requires at least one argument. 
Usage: launchprogram <program> <optional arguments> 
EOF 
    return 1 
fi 
mystatus=Z # assume we have a zombie process 
process="$(pgrep "$1" | tr \\n ,)" 
echo "$process" 
process="${process%,}" 
if [ "$process" != '' ] 
then 
     process="$(ps -o 'pid s cmd' -p "$process" | sed '1 d')" 
fi 
oldifs="$IFS" 
IFS="$(printf \nX)" 
IFS="${IFS%X}" 
for i in $process 
do 
    mystatus="${process[2]}" 
    case $mystatus in 
    (T) 
     if ! kill -CONT "${i[1]}" 
     then 
     IFS="$oldifs" 
     return $? 
     fi 
     ;; 
    (Z) 
     ;; 
    (*) 
     IFS="$oldifs" 
     return $? 
     ;; 
    esac 
done 
IFS="$oldifs" 
    setopt nobgnice 
"[email protected]" >/dev/null 2>&1 &! 
unsetopt nobgnice 
} 
+1

也許這是更好地做任何文本操作可言,但使用CPAN模塊'PROC :: ProcessTable'。 –

+1

顯示要替換的部分的一些示例輸入和預期輸出(即,用於所需的awk腳本)。 –

回答

2

我看不出有什麼,你應該使用awk/perl的/ ...代替,但這個劇本似乎不起作用:

  1. 兩行與IFS產生IFS等於n同時預計IFS包含只有換行符。
  2. "$process[2]"不正確,因爲它是第二個字符而不是第二列。沒有提到它的意思是$i[2]
  3. ${i[1]}相同。
  4. 默認情況下,zsh變量不會自動分割爲參數,因此for i in $process將始終迭代一個值:整個$process

因此,我將使用以下考慮重寫劇本:

  1. pgrep沒有必要的,因爲ps支持-C(假定程序名稱不包含空格或逗號)。由於有辦法刪除標題,因此不需要sed
  2. zsh有${(f)}需要按行分割字符串的人。 ${(s. .)}用空格分開。
  3. 最後(cmd)列未在任何地方使用。
  4. mystatus不需要默認值,因爲它在循環之外的任何地方都不會使用。
 
launchprogram(){ 
    emulate -L zsh 
    if [ $# = 0 ] 
    then 
     cat 
EOF 
     return 1 
    fi 
    local mystatus 
    local process 
    local i 
    local -a iarr 
    process="$(ps -o 'pid=,s=' -C "$1")" 
    echo "$process" 
    for i in ${(f)process} 
    do 
     iarr=(${(s. .)i}) 
     mystatus="${iarr[2]}" 
     case $mystatus in 
      (T) 
       if ! kill -CONT "${iarr[1]}" 
       then 
        return $? 
       fi 
       ;; 
      (Z) 
       ;; 
      (*) 
       return $? 
       ;; 
     esac 
    done 
    setopt nobgnice 
    "[email protected]" >/dev/null 2>&1 &! 
    # With emulate -L unsetting option is not needed 
}