약간 불안정하고 때때로 SSL 오류를 발생시키는 Python 스크립트가 있습니다. 일부 라이브러리에 깊이 묻혀 있는 일부 함수에 의해 예외가 발생하므로 기본적으로 해결 방법이 없습니다.
나는 여러 번 실행되는 while 루프를 사용하여 쉘 스크립트를 생성하고 루프 내에서 Python 스크립트를 실행하여 해키 솔루션을 구현했습니다.
이제 내가 원하는 것은 루프 반복이 시작되고 스크립트가 실행될 때 Python 스크립트가 실패하고 루프의 다음 반복이 스크립트를 다시 실행할 때까지 쉘 스크립트 내부의 루프가 원래 위치에 유지된다는 것입니다. .
이것이 효율적인가요? 더 좋은 방법이 있나요? 가장 중요한 것은 맞습니까?
답변1
존재하다:
cmd1
cmd2
또는
cmd1; cmd2
순차적으로 실행됩니다.
존재하다
cmd1 && cmd2
또는
cmd1 || cmd2
순서대로 실행되지만 cmd2
실행 여부는 전적으로 cmd1
성공(for &&
) 또는 실패(for ||
)에 따라 달라집니다.
존재하다
cmd1 | cmd2
또는
cmd1 & cmd2
cmd1 |& cmd2 # ksh
coproc cmd1; cmd2 # bash/zsh
또는
cmd1 <(cmd2) # ksh/zsh/bash (also yash though with a different meaning)
동시에 실행됩니다. 첫 번째 경우 일부 쉘은 나머지 스크립트를 계속하기 전에만 기다리는 cmd2
반면, 다른 쉘은 두 스크립트를 모두 기다립니다. 두 번째 경우에는 셸이 대기합니다 cmd2
( cmd1
비동기적으로 실행된다고 함(또는 대화형 셸에서 실행될 때는 백그라운드에서 실행된다고 함)). 반면에 세 번째 경우에는 cmd1
( cmd2
비동기적으로) 실행됩니다.
존재하다:
< "$(cmd1)" x=$(cmd2) y=$(cmd3) cmd4 "$(cmd5)" > "$(cmd6)"
명령은 순차적으로 실행되지만 순서는 셸에 따라 다릅니다. 어쨌든 cmd4
마지막에 실행됩니다.
존재하다:
cmd1 =(cmd2) # zsh
순서대로(먼저) 실행됩니다 cmd2
.
이러한 모든 경우에 이러한 명령은 다른 프로세스를 시작할 수 있습니다. 쉘은 이에 대해 알지 못하므로 이를 기다리는 것이 불가능합니다.
답변2
예. 맞습니다. 생각해 보세요:
#!/bin/bash
while true; do
sleep 1
echo "Slept 1"
echo "Exit status $?, ok."
sleep 1
echo "Slept 1, now executing faulty command 'ps q'"
ps q
echo "Exit status $?, not ok. Loop continues forever..."
done
...실행되면 다음과 같습니다.
./loop.sh
Slept 1
Exit status 0, ok.
Slept 1, now executing faulty command 'ps q'
ps: illegal option -- q
usage: ps [-AaCcEefhjlMmrSTvwXx] [-O fmt | -o fmt] [-G gid[,gid...]]
[-u]
[-p pid[,pid...]] [-t tty[,tty...]] [-U user[,user...]]
ps [-L]
Exit status 1, not ok. Loop continues forever...
Slept 1
Exit status 0, ok.
Slept 1, now executing faulty command 'ps q'
ps: illegal option -- q
usage: ps [-AaCcEefhjlMmrSTvwXx] [-O fmt | -o fmt] [-G gid[,gid...]]
[-u]
[-p pid[,pid...]] [-t tty[,tty...]] [-U user[,user...]]
ps [-L]
Exit status 1, not ok. Loop continues forever...
^C
루프가 항상 존재하는 한 true
루프 내부의 프로그램에 어떤 종료 코드가 있는지는 중요하지 않습니다. 작성된 순서대로 계속 실행됩니다.
이것이 효율적인가요? 더 좋은 방법이 있나요?
이것최고해결책은 Python 프로그램의 버그를 제거하는 것입니다!
답변3
제목 질문에 대답하려면 다음을 수행하십시오. 예, 셸 스크립트의 명령은 순서대로 동기식으로 실행되므로 Python 스크립트가 실행되는 동안 셸이 차단됩니다.
물론 오류의 원인을 수정하는 것이 더 좋지만 이것이 옵션이 아닌 경우 while true;do ./script.py; if [[ "$?" = 0]];break;done
0 상태 코드가 반환될 때까지 쉘 스크립트가 Python 스크립트를 실행하려고 시도하는 것이 현명한 접근 방식입니다( ).