zmq.error.ZMQError: Interrupted system call 해결

Jan 12, 2018

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

Traceback (most recent call last):
  File "/usr/bin/myapp", line 11, in <module>
    sys.exit(run())
  File "/usr/lib/python2.6/site-packages/click/core.py", line 716, in __call__
    return self.main(*args, **kwargs)
  File "/usr/lib/python2.6/site-packages/click/core.py", line 696, in main
    rv = self.invoke(ctx)
  File "/usr/lib/python2.6/site-packages/click/core.py", line 1060, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/usr/lib/python2.6/site-packages/click/core.py", line 889, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/usr/lib/python2.6/site-packages/click/core.py", line 534, in invoke
    return callback(*args, **kwargs)
  File "/usr/lib/python2.6/site-packages/myapp/cli.py", line 69, in worker
    worker_server.main()
  File "/usr/lib/python2.6/site-packages/myapp/worker/worker.py", line 35, in main
    rcv_data = main_receiver.recv_json()
  File "/usr/lib64/python2.6/site-packages/zmq/sugar/socket.py", line 399, in recv_json
    msg = self.recv(flags)
  File "socket.pyx", line 628, in zmq.backend.cython.socket.Socket.recv (zmq/backend/cython/socket.c:5616)
  File "socket.pyx", line 662, in zmq.backend.cython.socket.Socket.recv (zmq/backend/cython/socket.c:5436)
  File "socket.pyx", line 139, in zmq.backend.cython.socket._recv_copy (zmq/backend/cython/socket.c:1771)
  File "checkrc.pxd", line 21, in zmq.backend.cython.checkrc._check_rc (zmq/backend/cython/socket.c:6032)
zmq.error.ZMQError: Interrupted system call

이 내용이 중요한 것 같다.

zmq.error.ZMQError: Interrupted system call

환경:

  • CentOS release 5.8 (Final)

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

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

    ...
    receiver = context.socket(zmq.PULL)
    receiver.bind("inproc://worker-receiver")
    while True:
        rcv_data = receiver.recv_json() # 여기서 에러 발생

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

# terminal 1
python app.py

# terminal 2
strace -ff -xx -i  -p  $(ps -anpL | grep app.py | awk '{print $1}')

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

except Exception as e:
    print e
    print e.errno

# 출력 결과
Interrupted system call
4

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

errno.EINTR

Interrupted system call

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

# Centos 5
strace -V   
strace -- version 4.5.18

# Centos 6
strace -V           
strace -- version 4.8

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

See Also