Bash 包装器脚本生成多个子项

Bash 包装器脚本生成多个子项

我围绕 ffmpeg 制作了一个包装器,以便修改来自我的软件的调用,而无需更改源代码。

然而,当我使用它时,它似乎不断生成孩子执行相同的命令。就像如果我的软件多次调用它一样。

我不知道什么会导致这种行为?当软件直接调用ffmpeg时不会发生这种情况。

即使根本没有任何修改,无论是否使用 exec,都会发生这种情况。

#!/bin/bash

# command="$(echo $@ | awk '{gsub("warning","error"); print}')"

exec /usr/bin/ffmpeg.bak "$@"

我将 /usr/bin/ffmpeg 作为此脚本,然后转发到 ffmpeg.bak,这是真正的 ffmpeg 二进制文件。

无论我尝试什么,都会发生为同一命令生成多个进程的行为。有任何想法吗?

也许发生这种情况是因为软件会跟踪它,可能是通过使用 PID 之类的东西,这会让它感到困惑。

所以我需要尽可能透明地做到这一点

答案1

您发布的脚本没有明显的问题。我过去曾使用这种技术来包装其他命令。

您可以尝试在该行的正上方添加此命令exec,在我的基于 Debian 的系统上,该命令会将调用记录到/var/log/user.log(以及其他)

logger -t ffmpeg "$*"

然后您可以确认它被调用了多少次以及使用了什么参数。


有人建议调用进程看到 shell 脚本的 PID 消失并假设它已意外退出。我不相信这是原因。这是我的演示场景,其中包含一个脚本,名为/tmp/exec.sh

#!/bin/bash
#
tty=$(tty)
echo "tty is $tty, pid is $$"

# Identify processes running on this terminal
echo "Processes running on this terminal (1)"
ps -ft "${tty#/dev/}"

# Prepare to identify processes running on this terminal after the shell
# script has been replaced with another command
(
    sleep 3
    echo "Processes running on this terminal (2)"
    ps -ft "${tty#/dev/}"
) &

# Replace the shell script with another command
exec sleep 7

# Ooops
echo exec failed
exit 1

示例运行,带注释

chmod a+rx /tmp/exec.sh
/tmp/exec.sh

tty is /dev/pts/3, pid is 17550
Processes running on this terminal (1)
UID        PID  PPID  C STIME TTY          TIME CMD
roaima   29123 29121  0 22:10 pts/3    00:00:01 /bin/bash
roaima   17550 29123  0 22:13 pts/3    00:00:00 /bin/bash /tmp/exec.sh
roaima   17552 17550  0 22:13 pts/3    00:00:00 ps -ft pts/3

您可以在此处(上方)看到 shell 脚本 PID 为 17550,从 PID 29123 的交互式会话中运行。

Processes running on this terminal (2)
UID        PID  PPID  C STIME TTY          TIME CMD
roaima   29123 29121  0 22:10 pts/3    00:00:01 /bin/bash
roaima   17550 29123  0 22:13 pts/3    00:00:00 sleep 7
roaima   17553 17550  0 22:13 pts/3    00:00:00 /bin/bash /tmp/exec.sh
roaima   17555 17553  0 22:13 pts/3    00:00:00 ps -ft pts/3

现在发生的情况是 shell 脚本 PID 17550 已被命令替换sleep。 (PID 17553 是我们启动的子 shell,用于报告在此终端上运行的进程。)

相关内容