한 서버에서만 스크립트가 실패했는데 무엇이 없어서 그런지를 알 수 없었다. 오류 메시지는 문법 오류라고만 하는데 다른 서버에서는 같은 스크립트가 잘 돌고 있었다.
Table of contents
Open Table of contents
셸부터 갈린 환경
먼저 두 서버의 셸과 그 판을 나란히 찍어서 비교했다. 한쪽은 bash이고 다른 쪽은 경량 배포판의 기본 셸이었다.
스크립트에 bash 문법을 썼는데 한쪽에는 bash 자체가 없어서 난 오류였다. 셸만 다른 것이 아닐 수 있으므로 나머지 환경도 같이 비교하기로 했다.
차집합이 뽑아 준 목록
두 서버의 실행 파일 목록을 각각 받아 정렬한 뒤 차집합을 냈더니 한쪽에 없는 명령 넷이 한 번에 나왔다.
하나씩 실행해 보며 없는 것을 찾는 것보다 훨씬 빨랐다. 패키지 목록으로도 비교해 봤는데 배포판이 달라 조회 명령도 형식도 달랐고 패키지 이름 자체가 배포판마다 다르므로 명령 이름으로 비교하는 쪽이 맞았다.
스크립트가 하는 사전 확인
그 뒤로는 필요한 명령이 있는지를 스크립트가 시작 시점에 확인하게 했다. 없으면 무엇이 없는지를 이름으로 말하고 거기서 종료한다.
문법 오류보다 훨씬 나은 메시지이고 실패 지점이 실행 도중이 아니라 시작 시점으로 당겨지는 것도 이점이었다.
요구를 줄이는 쪽과 요구하는 쪽
간단한 처리는 외부 도구 없이 기본 도구로 바꿔서 깔아야 할 것을 줄였다. 전부 그렇게 하지는 않았는데 복잡한 것을 억지로 기본 도구로 짜면 읽기 어려워지기 때문이다.
간단한 것은 없이 하고 복잡한 것은 필요한 도구를 요구하는 쪽으로 갈랐다. 컨테이너에서 도는 것은 아예 이미지에 넣어서 서버마다 다를 일이 없게 했고 이미지 크기가 는 만큼 안 겪는 문제가 있었다.
목록만으로는 부족한 판 차이
어느 서버에 무엇이 있는지를 표로 적어 두니 스크립트를 쓸 때 무엇을 쓸 수 있는지 알 수 있었다. 그런데 목록에 있어도 안 되는 경우가 나왔다.
같은 명령이 양쪽에 다 있는데도 판이 달라서 옵션 하나가 옛 판에는 없었다. 도움말에서 그 옵션을 찾아 있으면 쓰고 없으면 빼는 형태로 바꿔서 넘어갔다. 있고 없고만이 아니라 판도 봐야 했고 목록에는 둘 다 있었다.
정리
- 무엇이 없는지는 있는 것 목록을 비교하면 나온다
- 하나씩 실행해 보는 것보다 차집합이 빠르다
- 패키지 이름은 배포판마다 다르므로 명령 이름으로 비교한다
- 스크립트가 필요한 것을 시작 시점에 확인하게 한다
- 간단한 것은 없이 하고 복잡한 것은 요구한다
- 컨테이너면 이미지에 넣어 서버마다 다를 일을 없앤다
- 어느 서버에 무엇이 있는지 표로 적는다
- 목록에 있어도 판이 다르면 안 되는 옵션이 있다