프로그램에서 호출하는 Python 스크립트로 호출되는 bash 스크립트 문제를 해결하는 방법은 무엇입니까?

프로그램에서 호출하는 Python 스크립트로 호출되는 bash 스크립트 문제를 해결하는 방법은 무엇입니까?

Ubuntu 18.04에서 실행되는 프로그램에서 호출하는 Python 스크립트로 호출되는 이 bash 스크립트 문제를 해결해야 합니다.

Python 스크립트와 프로그램은 블랙박스입니다. 내가 가진 유일한 정보는 잘 작동하고 스크립트 자체가 실패하기 때문에 bash 스크립트를 호출할 때만 Python 스크립트가 실패한다는 것입니다.

bash 스크립트는 매우 간단하고 그 자체로는 잘 작동하지만 이 스크립트에서 호출할 때마다 실패하므로 일종의 권한 오류가 있다고 생각됩니다. 문제는 실패할 때 표시되는 오류 메시지를 얻을 수 있는 방법을 찾아야 한다는 것입니다. 이 경우 이 정보를 어떻게 얻을 수 있나요?

Python 스크립트에서 bash 스크립트를 실행하면 터미널에 아무 것도 출력되지 않습니다 set -x.set -v

다음은 bash 스크립트의 내용입니다.

#!/bin/bash

echo "$1" >> /scripts/vomit
mv $1/*.mp4 .

문제 행은 입니다 mv $1/*.mp4. 해당 행을 주석 처리하면 프로그램에서 호출된 Python 스크립트 내에서 호출될 때 스크립트가 작동합니다. 난 그냥 모르겠어요mv 라인에 문제가 있습니다.

답변1

사용strace프로그램과 모든 하위 프로세스를 디버깅하기 위한 명령입니다.

새로운 프로세스의 경우:

strace -f command

기존 프로세스의 경우:

strace -fp PID

프로세스 ID를 모르는 경우(너무 빠르게 실행되기 때문에) sleep 20쉘 스크립트 시작 부분에 프로세스 ID를 추가하여 해당 PID를 찾을 시간을 확보한 ps wuax | grep bash다음 찾은 PID와 함께 위의 명령을 사용할 수 있습니다.

출력을 필터링하려면 를 사용하세요 -e. 파일에 저장하려면 를 사용하세요 . -o메시지 크기를 늘리려면 를 사용하세요 -s.man strace

더 나은 형식을 보려면 다음을 참조하세요.쉘에서 strace를 일반 텍스트로 구문 분석하는 방법은 무엇입니까?


이것은 실제적인 예입니다. 다음 myscript.sh파일이 제공됩니다.

#!/bin/bash -x
echo "$1"

다음 명령을 실행했습니다.

strace -f -e trace=execve,read,write -s1000 bash -x ./myscript.sh foo bar

다음과 같은 출력이 생성됩니다.

execve("/bin/bash", ["bash", "-x", "./myscript.sh", "foo", "bar"], [/* 41 vars */]) = 0
...
read(3, "#!/bin/bash -x\necho \"$1\"\n", 80) = 25
read(255, "#!/bin/bash -x\necho \"$1\"\n", 25) = 25
write(2, "+ echo foo\n", 11+ echo foo
)            = 11
write(1, "foo\n", 4foo
)                    = 4
read(255, "", 25)                       = 0
+++ exited with 0 +++

답변2

터미널에 아무것도 표시되지 않으면 출력을 파일로 리디렉션할 수 있습니다.

전체 스크립트(모든 출력)를 파일에 넣습니다(Python에서 변경).

./script.sh &> output.log

단일 명령의 경우:

mv -v $1/*.mp4 . 2> errors.log

.set -x#!/bin/bash -x


모든 stdout 및 stderr을 파일로 리디렉션하려면 다음을 참조하세요.Bash에서 stderr 및 stdout 리디렉션,지금 바로:

# Close STDOUT file descriptor
exec 1<&-
# Close STDERR FD
exec 2<&-

# Open STDOUT as $LOG_FILE file for read and write.
exec 1<> output.log

# Redirect STDERR to STDOUT
exec 2>&1

관련 정보