원격으로 작업을 할 일이 생겼습니다. 시간이 좀 걸리는 파이썬 패키지 설치 작업이었습니다.
이를 여러 장비에다 설치하려고 하는데 기존 코드는 장비 하나하나 일일이 접속해서 패키지도 하나하나 다 설치 완료 해야 다음 항목으로 넘어갈 수 있었습니다.
각 장비에서 소요되는 시간은 3분이 채 안되는데 전체 장비가 400여대 가까이 되니 1200분... 즉 20시간이 소요되는 겁니다...
이를 줄여보고자 며칠 째 집에도 제 때 못들어가고 작업하다가 대충 동작하는 코드를 완성해서 그 일부를 공유합니다.
connect 인자는 대충 아실겁니다. known_hosts=None 은 등록되지 않은 장비에 접속할 때 known_hosts 에 등록할 것인지 물어보게 되는데 (ssh 명령으로는 -o StrictHostKeyChecking=no 에 해당) 이를 회피하게 해줍니다.
핵심은 3가지 정도입니다.
- asyncssh 를 사용하는 것
- asyncssh.create_process 를 사용해서 결과(stdout, stderr 등)를 받아보지 않는것
- nohup 실행할명령 & 로 background 로 동작시키는 것
위 코드에서 다른 코드와 연계할 일이 없다면 12번째 줄부터는 모두 삭제하고 asyncio.run(run()) 한줄만 써도 됩니다.
만약 다른 전체 흐름과 함께 쓰려면 asyncio.run() 을 여러번 남발하면 loop 가 다르다는 오류를 만나게 될 것입니다. 이런 경우에는 예제처럼 loop 를 지정해서 써줘야 오류가 발생하지 않습니다.
물론 이런 것처럼 쓰레드를 활용한 다중 루프도 있습니다. 참고만 하세요.
엄청 삽질을 하면서 조금씩 asyncio 에 대해 배워가고 있는데 아직도 길이 머네요 ㅎㅎ
'IT > python' 카테고리의 다른 글
[python3][pyaudio] 초기화 디버그 메시지 숨기기 (0) | 2023.10.18 |
---|---|
[python3] 터미널에서 한 줄로 if else 사용하기 (2) | 2023.10.06 |
[python3] AttributeError: module 'lib' has no attribute 'X509_V_FLAG_CB_ISSUER_CHECK' (0) | 2023.09.19 |
[python] 문자열 뒤집기 (0) | 2023.06.19 |
[python][colab] 구글 드라이브 로그인하고 파일 접근하기 (0) | 2023.05.31 |