Bash |脚本不适用于所有目录。为什么?
Bash | Script does not work in all directories. Why?
以下脚本首先尝试以正常方式停止 tomcat(存储在数组中)。 10秒后Tomcat仍未停止,将被强制杀死。
脚本工作正常,但只在创建它的目录中。如果我将它复制到另一个文件夹,则它无法正常工作。
#!/bin/bash
array=(
"service1-tomcat"
"service2-tomcat"
"service3-tomcat"
"service4-tomcat"
"service5-tomcat"
)
#Stopping
if [ ! $(ps aux | grep [t]omcat/ | wc -l) -eq 0 ];then
echo "STOP Tomcats"
for i in "${array[@]}"
do
/data/tomcats/$i/bin/shutdown.sh &> /tmp/output.txt
done
echo " done"
fi
sleep 10
#Killing
if [ ! $(ps aux | grep [t]omcat/ | wc -l) -eq 0 ];then
echo "KILL $(ps aux | grep [t]omcat/ | wc -l) dogged Tomcats"
for i in "${array[@]}"
do
if [ ! $(ps aux | grep $i | wc -l) -eq 0 ];then
echo "$i"
fi
done
kill -9 $(ps aux | grep [t]omcat | awk '{print }')
if [ $(ps aux | grep [t]omcat/ | wc -l) -eq 0 ];then
echo "done"
fi
fi
脚本创建于 /var/data/tomcats:
如果在此处执行脚本,则会出现以下内容,这完全符合预期。
STOP Tomcats.
Done.
KILL 1 dogged Tomcats
service1-tomcat
Done
然而,当我在 /var/data 或 /tmp 或其他目录中 运行 时,它不会列出需要被杀死的 tomcat,而是一般的 ALL。输出如下所示:
STOP Tomcats.
Done.
KILL 1 dogged Tomcats
service1-tomcat
service2-tomcat
service3-tomcat
service4-tomcat
service5-tomcat
Done
我无法解释为什么脚本只能在一个文件夹中正常运行。没有相对路径等
我做错了什么?
grep [t]omcat
-- 因为该模式未被引用,所以 shell 会将其视为 shell glob 模式。如果当前目录中有一个名为 tomcat
的文件,grep 将得到一个普通的“tomcat”正则表达式模式而不是带有方括号的那个,然后 ps | grep
管道可能 return 结果太多。
如果您要将模式发送到外部命令(grep 或 tr 是特别常见的违规者),请引用该模式。
您可能会喜欢 pgrep
而不是 ps | grep
以下脚本首先尝试以正常方式停止 tomcat(存储在数组中)。 10秒后Tomcat仍未停止,将被强制杀死。
脚本工作正常,但只在创建它的目录中。如果我将它复制到另一个文件夹,则它无法正常工作。
#!/bin/bash
array=(
"service1-tomcat"
"service2-tomcat"
"service3-tomcat"
"service4-tomcat"
"service5-tomcat"
)
#Stopping
if [ ! $(ps aux | grep [t]omcat/ | wc -l) -eq 0 ];then
echo "STOP Tomcats"
for i in "${array[@]}"
do
/data/tomcats/$i/bin/shutdown.sh &> /tmp/output.txt
done
echo " done"
fi
sleep 10
#Killing
if [ ! $(ps aux | grep [t]omcat/ | wc -l) -eq 0 ];then
echo "KILL $(ps aux | grep [t]omcat/ | wc -l) dogged Tomcats"
for i in "${array[@]}"
do
if [ ! $(ps aux | grep $i | wc -l) -eq 0 ];then
echo "$i"
fi
done
kill -9 $(ps aux | grep [t]omcat | awk '{print }')
if [ $(ps aux | grep [t]omcat/ | wc -l) -eq 0 ];then
echo "done"
fi
fi
脚本创建于 /var/data/tomcats: 如果在此处执行脚本,则会出现以下内容,这完全符合预期。
STOP Tomcats.
Done.
KILL 1 dogged Tomcats
service1-tomcat
Done
然而,当我在 /var/data 或 /tmp 或其他目录中 运行 时,它不会列出需要被杀死的 tomcat,而是一般的 ALL。输出如下所示:
STOP Tomcats.
Done.
KILL 1 dogged Tomcats
service1-tomcat
service2-tomcat
service3-tomcat
service4-tomcat
service5-tomcat
Done
我无法解释为什么脚本只能在一个文件夹中正常运行。没有相对路径等
我做错了什么?
grep [t]omcat
-- 因为该模式未被引用,所以 shell 会将其视为 shell glob 模式。如果当前目录中有一个名为 tomcat
的文件,grep 将得到一个普通的“tomcat”正则表达式模式而不是带有方括号的那个,然后 ps | grep
管道可能 return 结果太多。
如果您要将模式发送到外部命令(grep 或 tr 是特别常见的违规者),请引用该模式。
您可能会喜欢 pgrep
而不是 ps | grep