通过 nohup 检查是否成功启动

问题描述

在其中一台服务器上,我有一个脚本,在其中一个阶段将 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 的时间应该可以忽略不计)。您可以随意调整检查的最大次数和间隔。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...