我的机器上运行了4个重要的服务,我想一直看到它们。我有这个简单的bash脚本作为bash配置文件运行。
echo
PROC="nginx mysql php-fpm pptpd"
for p in $PROC
do
ps cax | grep $p > /dev/null
if [ $? -eq 0 ]; then
echo -e "\e[92m$p running\e[0m"
else
echo -e "\e[101m$p IS NOT RUNNING \e[0m"
fi
done
echo
此脚本的输出是:
nginx running
mysql running
php-fpm running
pptpd running
我怎么能这样做?
nginx running - mysql running - php-fpm running - pptpd running
答案 0 :(得分:1)
使用printf
或添加-n
标志以回显。
#!/bin/sh
showstatus() {
echo
while [ "$1" ]; do
if ps cax | grep -qF "$1"; then
msg='\e[92m%s running\e[0m'
else
msg='\e[101m%s IS NOT RUNNING \e[0m'
fi
printf "$msg" "$1"
shift
[ "$1" ] && printf ' - '
done
echo
}
showstatus nginx mysql php-fpm pptpd
#!/bin/sh
showstatus() {
echo
while [ "$1" ]; do
if pkill -0 "$1"; then
msg='\e[92m%s running\e[0m'
else
msg='\e[101m%s IS NOT RUNNING \e[0m'
fi
printf "$msg" "$1"
shift
[ "$1" ] && printf ' - '
done
echo
}
showstatus nginx mysql php-fpm pptpd
答案 1 :(得分:1)
首先将状态行构建到数组中,然后打印数组:
status=()
for p in $PROC
do
if ps cax | grep -q $p; then
status+=( " \e[92m$p running\e[0m " )
else
status+=( " \e[101m$p IS NOT RUNNING \e[0m " )
fi
done
(IFS=-; echo -e "${status[*]}")
${status[*]}
扩展到由IFS
的第一个字符连接的数组中的每个元素,我之前设置为-
。请注意,我使用了子shell (IFS=-; echo ...)
,因此更改IFS
不会影响脚本的其余部分。
其他说明:
ps cax | grep $p > /dev/null
if [ $? -eq 0 ]; then
可以合并到:
if ps cax | grep -q $p; then
更简洁,更易读。您也可以考虑使用pgrep
。