linux - 通过 nohup 检查是否成功启动

标签 linux bash wait 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 我希望我没有过度描述细节。这是我的第一个问题。 预先感谢 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/

相关文章:

c++ - 在启动另一个计时器之前等待 20 秒的非阻塞计时器

linux - 跨多个文件增量查找和替换 - Bash

bash - 减少 awk 遍数

Swift - 如何在不挂起应用程序的情况下等待某些东西

java - 同步方法中的等待与不等待 (java)

Linux/Perl 返回超过 x 分钟未修改的文件夹列表

javascript - 从 coffeescript 编译后使用 makefile 合并 javascript 文件

c - 嵌入式 Linux : Reading bytes from serial port too slow for quicker transfer

bash - 根据多列匹配汇总一列(部分部分)

java - 等待不允许 JFrame 更新