我正在尝试编辑 WebLogic Server 卡住线程警报脚本以在 Linux 操作系统(特别是 Oracle Linux 和 RHEL)上运行。
我在网上看到了各种脚本并进行了一些编辑以准备它们,如下所示。
我的目标是通过 找到卡住线程的总数jstack
,如果数量大于 0,则分别发送一封电子邮件,其中包含每个 Java 进程的卡住线程详细信息(带有托管服务器名称)。如果没有卡住的线程,则写入OKAY
该文件并等待脚本再次运行。
checkstucklog=/home/weblogic/lastStuckCheck.log
DATE=`date +"%Y_%m_%d %H:%M:%S"`
#count="$(ps -ef | grep Dweblogic | cut -c 10-15 | tr -d ' ' | xargs jstack -F | tee /home/weblogic/msALL_stuck.log_`/usr/bin/date +\%m-\%d-\%y-\%H-\%M` | grep STUCK | wc -l)"
count="$(ps -ef | grep Dweblogic | cut -c 10-15 | tr -d ' ' | xargs jstack -F -l | tee /home/weblogic/msALL_stuck_$DATE.log | grep STUCK | wc -l)"
if [ $count > 0 ]
then
echo "\n Server has stuck threads" `/usr/bin/date +\%m-\%d-\%y-\%H-\%M` | mail -s 'STUCK thread on server' your_mail_address@mail_address.com > $Sfile
else
echo "\n Stuck Thread Status = OKAY" > $checkstucklog
fi
exit
不过,我对 bash 脚本编写有点薄弱。您能帮助我使以下脚本正常工作吗?
- 我编写脚本的方式正确吗?
- 我可以生产另一种替代品来代替 T 恤吗?
我无法确认该脚本的功能,因为还没有卡住的线程。但我认为这不会起作用。我无法通过从操作系统进程中查找来找到如何打印托管服务器名称。
答案1
让我尝试向您指出一些您应该重新考虑的要点:
排队:
count="$(ps -ef | grep Dweblogic | cut -c 10-15 | tr -d ' ' | xargs jstack -F -l | tee /home/weblogic/msALL_stuck_$DATE.log | grep STUCK | wc -l)"
您使用DATE
内部有空间的变量。如果你以这种方式生成它会更好(使用其他字符而不是空格)
DATE=`date +"%Y_%m_%d_%H:%M:%S"`
您也可以重写命令来awk
删除一些命令:
count="$(ps -ef | awk '/Dweblogic/ {print $2}' | xargs jstack -F -l | tee /home/weblogic/msALL_stuck_$DATE.log | grep STUCK | wc -l)"
关于jstack
命令:当您使用Weblogic时,明智的做法是使用Oracle java(同一公司的产品)。而在Oracle java中jstack
没有这个选项-F
。
我知道Oracle java是商业产品,但据我记得如果你使用Oracle产品(在本例中为WebLogic),你可以免费使用java。但最好就这种情况联系您的法律部门(检查许可协议)。
当您比较数字时,bash
推荐的形式是:
if [ "$count" -gt 0 ]
好的做法是将变量放在双引号中,尤其是当它们是动态生成时