我有一个在超时时启动 tcpdump 的命令。因此,我编写了一个 shell 脚本来启动此进程,并向 shell 脚本的执行者提供在 shell 脚本中创建的进程 ID。我的 shell 脚本看起来像
#!/bin/bash
TIMEOUT_DURATION=3600
TIMEOUT=${v_TIMEOUT:-$TIMEOUT_DURATION}
FILTER=${v_FILTER:-} # make sure this parameter is URI encoded if it has special symbols inside filter
FILENAME=$(date +%s).log
TCPDUMP_PID=$(timeout 3600 tcpdump -i eth0 -w $FILENAME $FILTER > /dev/null 2>&1 & echo $!)
echo "TCPDUMP_PID=$TCPDUMP_PID"
但我只得到
tcpdump
的进程 ID,而不是 timeout
。我想获取这两个进程的进程 ID 并在脚本中回显它,以便执行程序可以使用它们在稍后的时间点杀死这两个进程。
我不想使用
杀死所有进程pkill tcpdump; pkill timeout;
这里。我想只使用进程 ID 来杀死。
运行上述脚本时生成的 2 个进程如下所示
我在 TCPDUMP_ID 上仅收到 21,而不是 23。
这是如何实现的?
建议更改脚本以使用
tcpdump
选项限制 -c
录制时间,而不是超时。
并使用
pgrep
命令将正确的 pid 获取到 TCPDUMP_PID
。
#!/bin/bash
TIMEOUT_DURATION=3600
TIMEOUT=${v_TIMEOUT:-$TIMEOUT_DURATION}
FILTER=${v_FILTER:-} # make sure this parameter is URI encoded if it has special symbols inside filter
FILENAME=$(date +%s).log
tcpdump -i eth0 -c ${TIMEOUT} -w $FILENAME $FILTER > /dev/null 2>&1 &
TCPDUMP_PID=$(pgrep -f tcpdump)
echo "TCPDUMP_PID=$TCPDUMP_PID"