问题描述
在其中一台服务器上,我有一个脚本,在其中一个阶段将 tcpdump 发送到 nohup。
start_dump() {
2>&1 /usr/bin/nohup /usr/sbin/tcpdump -s 0 -i $IFACE host $HOST -C 1000 -w $DUMP_DIR/$LOGIN/$DATE\_$HOST.pcap | awk '{ print strftime("%Y-%m-%d %H:%M:%S"),$0; fflush(); }' >> /var/log/dump/nohup_$LOGIN.out &
}
我需要确保一切顺利并且正在写入转储。为此,我会检查 ps 中是否存在该进程,但在某些情况下,即使该进程存在,我也会收到错误消息。
dump_check() {
ps u -C tcpdump | grep $HOST > /dev/null
}
为了调试,我做了一个检查循环,在我看来,原因是在检查条件之前转储没有时间启动。
start_dump() {
2>&1 /usr/bin/nohup /usr/sbin/tcpdump -s 0 -i $IFACE host $HOST -C 1000 -w $DUMP_DIR/$LOGIN/$DATE\_$HOST.pcap | awk '{ print strftime("%Y-%m-%d %H:%M:%S"),$0; fflush(); }' >> /var/log/dump/nohup_$LOGIN.out &
}
dump_check_check() {
ps u -C tcpdump | grep $HOST
echo $?
}
...
start_dump
for run in {1..10}; do
dump_check_check
done
显然我是对的。这就是我得到的:
+ start_dump
+ for run in {1..10}
+ dump_check_check
+ grep 172.x.x.x
+ ps u -C tcpdump
+ awk '{ print strftime("%Y-%m-%d %H:%M:%S"),$0; fflush(); }'
+ /usr/bin/nohup /usr/sbin/tcpdump -s 0 -i ppp0 host x.x.x.x -C 1000 -w /root/dumps/xxxx/2021-01-21_17:31:51_172.19.5.234.pcap
+ echo 1
1
+ for run in {1..10}
+ dump_check_check
+ grep 172.x.x.x
+ ps u -C tcpdump
+ echo 1
1
+ for run in {1..10}
+ dump_check_check
+ grep 172.x.x.x
+ ps u -C tcpdump
root 768 0.0 0.0 10020 1468 pts/0 D+ 17:31 0:00 /usr/sbin/tcpdump -s 0 -i ppp0 host 172.x.x.x -C 1000 -w /root/dumps/xxxx/2021-01-21_17:31:51_172.19.5.234.pcap
+ echo 0
0
首先,转储本身在检查条件后开始执行,为什么? 其次,即使启动后,下一次条件检查也没有成功,据我了解,这是由于命令发送到 nohup 并且在下一次检查之前转储没有时间启动。好吧,第三次一切正常。
问题:看来解决这个问题的办法是在检查条件前加一个延迟,但是sleep不适合我,因为有时检查是第一次,有时是第五次.我不能浪费这么多时间,这对我来说很重要。 我正在寻找一种解决方案,其中成功检查将在成功之前运行多次,但不会超过特定时间。如果此时间到期,则会出现错误。
ps 我希望我没有把细节做得过分。这是我在这里的第一个问题。 提前致谢,朋友们!
解决方法
我正在寻找一种解决方案,其中成功检查将在成功之前运行多次,但不会超过特定时间。如果此时间到期,则会出现错误。
你总是可以使用这样的东西:
check_dump()
{
for run in {1..10}
do sleep .1
ps u -C tcpdump | grep $HOST && return 0
done
return 1
}
start_dump
if check_dump; then echo SUCCESS; else echo ERROR; fi
这将运行不超过大约一秒钟(ps | grep
的时间应该可以忽略不计)。您可以随意调整检查的最大次数和间隔。