소스 코드를 변경하지 않고 소프트웨어의 호출을 수정하기 위해 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은 이 터미널에서 실행되는 프로세스에 대해 보고하기 위해 시작한 하위 셸입니다.)