Linux Csh守护进程检测脚本误报问题咨询
守护进程检测脚本误报问题
我编写了如下用于检测守护进程的Csh脚本:
#!/bin/csh while(1) ps | grep -v "PID" | head -1 > /export/home/system/system/tmp/ppp set pts = `awk -f: '{print $2}' /export/home/system/system/tmp/ppp` echo $pts[1] > /export/home/system/system/tmp/ppp1 set ww = `cut -c5-6 /export/home/system/system/qtmp/ppp1` clear @ a = 0 echo "############################ " echo " < C3svr2 Quick-Check > " echo "############################ " echo " < Application count = 46 , Modify DATE = 2023.09.14 > " echo "------------------------------------------------------------------ " echo " 9700/8700/7700/9300/8300 " echo " 7300/gwchopan/ex_txt2chulpand/yunmon/m_embargod " echo " rtf2chulgod/ex_xml2archived/newsis_con/newsis_rcv/newsis_reg " echo " bloom_reg/get_bloom/pdf_rcv/ynewsml_reg/ex_jdistd.ns " echo " ex_jdistd.ww/youtubed/smartx/logmond/snd_dotcom " echo " im_photod/im_myphotod/img2chopan/im_dbd/im_sportsd " echo " im_onlinephotod/im_arcphotod/im_newsisd/im_news1d/im_ftpd " echo " im_getpicd/im_yond/ex_image2biz/ex_img2archived/get_pool " echo " im_poold/tomcat/nmbd/smbd/sp1agentd/sp1mon " echo " ----------------------------------------------------------------- " ps -ef|grep nccs > /export/home/system/system/qtmp/qtmp.$ww foreach DDD( 9700 8700 7700 9300 8300 7300 gwchopan ex_txt2chulpand yunmon m_embargod rtf2chulgod ex_xml2archived newsis_con newsis_rcv newsis_reg bloom_reg get_bloom pdf_rcv ynewsml_reg ex_jdistd.ns ex_jdistd.ww youtubed smartx logmond snd_dotcom im_photod im_myphotod img2chopan im_dbd im_sportsd im_onlinephotod im_arcphotod im_newsisd im_news1d im_ftpd im_getpicd im_yond ex_image2biz ex_img2archived get_pool im_poold tomcat ) cat /export/home/system/system/qtmp/qtmp.$ww | grep -w $DDD > /export/home/system/system/qtmp/qtmp1.$ww if ( $status == 1 ) then cat /export/home/system/system/qtmp/qtmp1.$ww | grep -v $DDD echo -n "$DDD""(Down)" else echo -n "! " @ a++ sleep 0.3 endif end ps -ef|grep mbd > /export/home/system/system/qtmp1/qtmp.$ww foreach DDD(nmbd smbd) cat /export/home/system/system/qtmp1/qtmp.$ww | grep -w $DDD > /export/home/system/system/qtmp1/qtmp1.$ww if ( $status == 1 ) then cat /export/home/system/system/qtmp1/qtmp1.$ww | grep -v $DDD echo -n "$DDD""(Down)" else echo -n "! " @ a++ sleep 0.3 endif end ps -ef|grep siem > /export/home/system/system/qtmp2/qtmp.$ww foreach DDD(sp1agentd sp1mon) cat /export/home/system/system/qtmp2/qtmp.$ww | grep -w $DDD > /export/home/system/system/qtmp2/qtmp1.$ww if ( $status == 1 ) then cat /export/home/system/system/qtmp2/qtmp1.$ww | grep -v $DDD echo -n "$DDD""(Down)" else echo -n "! " @ a++ sleep 0.3 endif end echo " " sleep 3 end
但在多台PC上运行该脚本时,有时会误报正常运行的守护进程已停止,请问出现这种情况的原因是什么?
误报原因分析
1. 临时文件路径错误导致依赖失效
脚本开头生成/export/home/system/system/tmp/ppp1,但后续获取ww变量时却读取/export/home/system/system/qtmp/ppp1——路径中的tmp被错误替换为qtmp,引发两种问题:
- 若
qtmp/ppp1不存在,cut命令执行失败,ww变量为空,后续生成的临时文件(如qtmp/qtmp.)名称异常,最终grep无法匹配到进程; - 若
qtmp/ppp1是历史残留文件,ww值不更新,会读取过期的进程快照,导致判断错误。
2. 进程前置过滤逻辑存在漏洞
脚本先用ps -ef|grep nccs、ps -ef|grep mbd等命令过滤进程列表,再在子循环中匹配守护进程名:
- 若目标守护进程的命令行中不包含
nccs/mbd/siem这些关键词,即便进程正常运行,也不会被写入临时文件,后续grep $DDD自然匹配不到,直接误报“Down”; - 例如
tomcat进程如果命令行里没有nccs,就会被排除在第一次过滤的结果之外,导致误判。
3. $status变量的时效性与匹配逻辑问题
子循环中$status保存的是上一条命令的退出状态,但存在两个隐患:
- 如果临时文件写入失败(如权限不足、磁盘空间满),
$status会返回1,此时即便进程存在,也会误报; grep -w要求完全匹配单词,但如果进程名在命令行中是参数的一部分(比如run_9700.sh),-w可能匹配不到,导致误判进程未运行。
4. 临时文件未清理引发循环冲突
脚本在无限循环中生成临时文件(如qtmp.$ww),但没有清理旧文件的逻辑:
- 当
ww变量重复时,新生成的临时文件会覆盖旧文件,若覆盖过程被循环中的其他操作打断,可能导致文件内容不完整; - 不同机器或同一机器多轮循环中
ww值重复,都可能读取到不完整的进程列表。
5. 进程快照的时间差问题
脚本先一次性生成进程快照,再逐个匹配:
- 如果在生成快照之后、匹配之前,目标进程恰好重启,快照里没有新进程的信息,就会误报进程已停止;
- 尤其是守护进程可能短暂重启,这种时间差会直接导致误判。
内容的提问来源于stack exchange,提问作者kang12542
相关产品推荐
相关产品推荐

