zmq.error.ZMQError: Interrupted system call 해결

python 애플리케이션에서 다음 에러가 발생했다.

이 내용이 중요한 것 같다.

zmq.error.ZMQError: Interrupted system call

환경:

  • CentOS release 5.8 (Final)

Centos 6에서는 문제가 없는 앱이었는데, Centos 5에서만 이런 문제가 생겼다. 그래서 trace를 하게 되었다.

app.py는 다음과 같이 하나의 스레드로 0mq 소켓으로 수신 받고 있었다. strace를 하면 아래에 표시된 부분에서 에러가 발생했다.

다음과 같이 두 개의 터미널을 띄워놓고, 순서대로 커맨드를 실행했다.

try로 에러코드를 확인했다.

4번을 표준 errno 시스템 심볼을 확인하니 다음으로 나타났다.

errno.EINTR

Interrupted system call

Centos 6에서는 문제가 발생하지 않았다.

Centos 5에서는 strace 할 때 무엇인가 signal을 보내면서 문제가 발생하는 것으로 보인다. 그래서 우선 예외처리하는 것으로 문제를 해결했다.

 

Python에서 Signal 처리

Python 스크립트가 예기치 않게 종료했을 때, 어떤 signal에 의해 종료되었는지를 확인이 필요한 경우가 있다.  다음 코드를 변형해서 프로그램에 맞게, 적절히 적용할 수 있다.

이 외에도 종료되는 시점에 무엇인가 실행할 필요가 있을 때는 atexit를 사용 할 수 있다.

 

Supervisor. 프로세스 관리, 로그 확인

supervisor는 유닉스 계열의 시스템에서 여러 프로세스를 모니터링하고, 제어하는 프로그램이다.

여러 프로젝트를 진행할 때, 개발서버를 환경에 따라 매번 세팅해야 했다.이 프로젝트는 이 개발서버, 저건 저 개발 서버, 프로젝트가 많아지면서 개발서버가 분산되어 관리하기가 어려워져갔다. docker로 로컬 PC에서 환경을 돌려서 꽤 오랫동안 정착했었지만, 몇몇 문제점이 나타나게 됐다.

윈도 환경이라 docker-machine을 올리려면 Virtualbox를 써야 하는데, 리소스가 부족한 경우가 많이 발생했다. 보안 업데이트 때문에 재부팅하면 docker-machine 올리고, 컨테이너 올리고, 프로세스를 실행하는 작업을 해줘야 했는데, 꽤 귀찮았다. 그리고 개발할 때는 컨테이너가 실행되고, 자동으로 프로세스가 뜨도록 세팅하지 않아야 할 경우도 많았다.

그래서 원격의 한 개발서버에서 모든 프로젝트를 작업할 수 있게 환경을 만들었다. 이 때, Supervisor를 사용해서 스위치 on/off 하는 방식으로 프로세스를 관리하며 작업을 할 수 있게 만들었다.

Supervisor 설치하기 :

python 모듈이라서 간단하게 설치할 수 있다.

이제 설정파일을 어떻게 작성하는지 보겠다.

예:

기존 설정파일 다른 부분은 수정하지 않고, 다음과 같이 파이선 프로그램을 추가했다.

설명
command 어떤 커맨드를 실행할지 정의
directory 어떤 디렉토리에서 실행할지 정의
autostart supervisor 데몬이 시작할 때 이 프로세스도 같이 실행할지 정의

이번에는 supervisorctl로 프로세스 관리하는 방법을 알아볼 것이다.

이렇게 실행하면 REPL 상태가 된다. 여기서 각종 커맨드를 사용할 수 있다. 위 예에서는 python 프로세스 3개, webpack 프로세스 1개, 파일 동기화 하는 프로세스 1개를 보여주고 있다.

현재 다음과 같은 프로세스를 사용하고 있다.

  • node.js(gulp + webpack 포함) : 프론트엔드, 백엔드 개발
  • nginx : lua 개발
  • elasticsearch
  • python(flask, zeromq, …)
  • php-fpm

mysql이나 apache 등도 foreground로 실행하도록 추가하면 되지만 이미 서비스스크립트가 있어서 따로 등록하지 않았지만 이들도 supervisor를 통해 관리할 수 있다.

production 환경에서도 사용하면 supervisor를 통해 로그를 볼 수 있고, 프로세스를 관리할 수 있어서 편할 것 같다. 그 전에 production에 사용한 사례가 있는지 확인은 필요할 것 같다.

Python 개발 노트

Python으로 개발하면서 작성한 메모로, 기본적인이지만 오랜만에 Python을 사용할 때 참고할 만한 내용을 적어봤다. Python 2.7 버전 기준이다.

if문

예외처리

버전 알아내기

SQLAlchemy

SQLAlchemy는 Python에서 인기있는 ORM 모듈이다.

Flask

Flask는 가벼운 Python 웹프로임웍이다. RESTful API를 아주 쉽고 간단하게 만들 수 있다.

API의 예외 처리

Implementing API Exceptions 페이지에 아주 잘 나타나있다.

우선 예외 클래스를 만든다.

어떤 API에서 예외가 발생했을 때 표시할 페이지의 응답부분을 만든다.

이제 API에서 예외가 발생했을 때, invalidUsage 클래스를 사용해서 예외를 전파하면 된다.

Jsonify 에러

Flask의 이와 관련한 이슈에 따르면 simplejson을 설치하면 자동으로 jsonify가 그것을 사용한다고 했다.

PIP

설치

사용

에러

DistributionNotFound

setuptools를 설치한다.