따라서 문제는 느린 인터넷 연결에서 비롯되며 "apt-get update"(debian)를 실행하려고 할 때 문제가 발생합니다. apt-get은 4개의 작은 데이터 청크를 가져오고 1개의 큰 데이터 청크를 가져오려고 시도합니다. 약 5분 후 25% 완료되면 해당 청크 다운로드를 포기하고 더 큰 대체 데이터를 가져오려고 시도합니다. 5분 후 20% 완료되면 포기하고 더 큰 대안을 시도하고, 5분 후 10% 완료되면 포기하고 필요한 것을 얻을 수 없다고 불평합니다. "apt-get update"를 다시 실행하려고 하면 4개의 작은 청크를 다시 풀다운하고 중단된 부분부터 3개의 큰 청크를 계속 처리합니다. apt의 http::Timeout 및 ftp::Timeout 설정을 조사하고 사용해 보았지만 이 상황을 처리할 수 있는 설정이 없는 것 같습니다. 나의 현재 접근 방식은 이 문제를 처리하고 시도할 때마다 추가로 10분을 낭비하지 않도록 대안을 적용하면서 Ctrl-C를 누르는 것입니다. 혼자서 아이들을 돌볼 수 있게 하고 싶어요.
내가 염두에 두고 있는 것은 다음과 같은 쉘 스크립트입니다.
시간 초과, sudo apt-get 업데이트로 시작하고 언제든지 apt-get이 성공적으로 완료되면 즉시 sudo apt full-upgrade를 계속하고 결국 종료되지만 그 동안 apt-get이 화면에 한 줄을 인쇄하면 "Ign: "이라는 텍스트를 사용한 다음 pkill apt를 실행하고, 만료 시간이 30분 미만이면 sudo apt-get update에서 다시 시작하고, 그렇지 않으면 "지금은 Apt-update를 완료할 수 없습니다!"를 echo하고 종료합니다.
내가 알고 싶은 것은 bash 스크립트가 실제로 이와 같은 작업을 수행할 수 있다는 것입니다. 그렇다면 검색을 시작하는 명령에 대한 팁이 도움이 될 것입니다. apt-get의 확인과 실행은 두 프로세스에서 이루어져야 한다고 생각하는데, 한 프로세스가 어떻게 다른 프로세스의 화면 출력과 종료 상태를 확인할 수 있는지 모르겠습니다. Bash 스크립트가 이 작업을 수행할 수 없다면 어떤 다른 도구를 살펴봐야 할지 모르겠습니다. Python이 이를 수행할 수 있습니까?
답변1
여기에는 복잡한 문제가 있습니다.
- 프로그램이 화면에 인쇄하는 내용을 스크립트가 모니터링할 수 있습니까?
예, strace
가능합니다.
strace -p<process id> -s1000 -e write
이는 프로세스 ID에 속한 프로세스가 무엇을 쓰고 있는지 모니터링하여 출력을 기본 32자에서 1000자로 늘립니다.
- 명령이 문자열을 출력할 때 뭔가를 할 수 있나요?
이는 매우 간단하며 올바른 방향으로 나아갈 수 있도록 도와줍니다.
<command-you-want-to-watch> | tee file_to_watch
tee
파일뿐만 아니라 화면에도 출력됩니다. 그럼에도 불구하고 일반적으로 화면에서 발생하는 멋진 오버레이 중 일부가 표시되지 않을 수도 있습니다. 보기에 관심이 없다면 출력을 파일로 리디렉션할 수 있습니다 <command> >file
.
관찰자 스크립트:
#!/bin/bash
while true; do
if grep -q "phrase1" file_to_watch; then
#do stuff
break
fi
if grep -q "phrase2" file_to_watch; then
#do stuff
break
fi
sleep 1
done
이것은 매초마다 파일에서 문구를 확인하고 원하는 대로 수행한 다음 종료됩니다(이러한 break
명령문은 무한 루프를 종료합니다).