ソースコードを変更せずにソフトウェアの呼び出しを変更するために、ffmpegの周りにラッパーを作成しました。
ところが、いざ使ってみると、同じコマンドを実行する子が生成され続けているようです。私のソフトウェアが何度も呼び出すように。
この動作の原因が何であるかわかりません。ソフトウェアがffmpegを直接呼び出す場合、これは発生しません。
これは、execを使用するかどうかにかかわらず、まったく変更がない場合でも発生します。
#!/bin/bash
# command="$(echo $@ | awk '{gsub("warning","error"); print}')"
exec /usr/bin/ffmpeg.bak "$@"
私はこのスクリプトで/usr/bin/ffmpegを持っていて、実際のffmpegバイナリであるffmpeg.bakに渡します。
何を試しても、同じコマンドに対して複数のプロセスを生成するアクションが発生します。どんなアイデアがありますか?
おそらく、これはソフトウェアがPIDなどを使用してそれを追跡して混乱する可能性があるためです。
そのため、この作業をできるだけ透明にする必要があります。
答え1
公開したスクリプトには明らかな問題はありません。私は過去に他のコマンドをラップするためにこの技術を使用したことがあります。
行のすぐ上にこのコマンドを追加してみることができます。私のDebianベースのシステムでは、次のexec
呼び出しを記録します。/var/log/user.log
logger -t ffmpeg "$*"
その後、呼び出し回数とパラメータを確認できます。
呼び出しプロセスがシェルスクリプトの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
ここでは、PID 29123を使用する対話型セッションで実行されているPID 17550を使用するシェルスクリプトを表示できます。
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
今起こっていることは、シェルスクリプトPID 17550がコマンドに置き換えられたことですsleep
。 (PID 17553は、この端末で実行されているプロセスの報告を開始したサブシェルです。)