如何使用 shell 脚本在单行命令上创建 2 个 Linux 进程 ID

问题描述 投票:0回答:1

我有一个在超时时启动 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 个进程如下所示

ps -A

我在 TCPDUMP_ID 上仅收到 21,而不是 23。

这是如何实现的?

linux shell command-line
1个回答
0
投票

建议更改脚本以使用

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"
© www.soinside.com 2019 - 2024. All rights reserved.