我有以下 Z shell 脚本来启动一个程序实例,如果一个程序实例还没有主动运行,即使有一个僵尸实例,或者恢复一个停止的实例。我觉得必须有更好的方法来使用,也许使用 perl。shell 脚本似乎太笨拙了——至少应该可以从另一种语言(如 perl 或 awk)进行文本操作。
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
"$@" >/dev/null 2>&1 &!
unsetopt nobgnice
}