在其中一台服务器上,我有一个脚本,其中在其中一个阶段 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 我希望我没有过度描述细节。这是我的第一个问题。 预先感谢 friend 们!
最佳答案
I am looking for a solution where the success check will run multiple times before success, but no longer than a specific time. If this time expires, an error should appear.
你总是可以使用这样的东西:
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
的时间应该可以忽略不计)。您可以随意调整最大检查次数和检查间隔。
关于linux - 通过 nohup 检查是否成功启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66158616/