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