我围绕 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,用于报告在此终端上运行的进程。)