Ruby выходит с кодом завершения 1, отвечающим на TERM, если он работает без оболочки - PullRequest
0 голосов
/ 04 мая 2018

Если Ruby получает сигнал TERM, он обычно выходит с кодом выхода 143, который в соответствии с этим источником указывает, что процесс успешно ответил на этот сигнал. Но если я заставлю скрипт работать без оболочки, код выхода будет 1.

С оболочкой:

> cat Dockerfile 
FROM ruby:alpine
CMD ruby -e "Process.kill('TERM', Process.pid)" # <- shell form

> docker build -t term_shell . > /dev/null
> docker run term_shell
Terminated

> echo $?
143

без оболочки:

> cat Dockerfile
FROM ruby:alpine
CMD ["ruby", "-e", "Process.kill('TERM', Process.pid)"] # <- exec form

> docker build -t term_exec . > /dev/null
> docker run term_exec

> echo $?
1

Но если я выйду из себя с помощью 143, код выхода будет таким, как ожидалось:

> cat Dockerfile
FROM ruby:alpine
CMD ["ruby", "-e", "exit(143)"] # <- exec form

> docker build -t exit_exec . > /dev/null
> docker run exit_exec

> echo $?
143

Почему это? Код выхода, когда ruby ​​получает TERM, приходит не от Ruby, а от оболочки?

1 Ответ

0 голосов
/ 07 мая 2018

Код выхода вашего второго примера - 1, потому что вызов Process.kill('TERM', Process.pid) не удался. ruby -e выход из-за этой ошибки, и код состояния в этом случае 1.

  • При CMD ruby -e "Process.kill('TERM', Process.pid)" docker выполняет данную команду в оболочке. В работающем контейнере это означает, что корневой процесс с pid 1 будет /bin/sh -c, а команда ruby -e будет выполнена в дочернем процессе с другим pid (например, 6).
  • При CMD ["ruby", "-e", "Process.kill('TERM', Process.pid)"] docker напрямую запускает ruby -e как корневой процесс с pid 1.

PID 1 в Linux ведет себя не так, как обычные. Из документации докера :

Примечание: Процесс, выполняемый как PID 1 внутри контейнера, обрабатывается Linux специально: он игнорирует любой сигнал с действием по умолчанию. Таким образом, процесс не завершится на SIGINT или SIGTERM, если он не закодирован для этого.

Таким образом, в вашем случае сигнал TERM не будет отправлен вам.

Вы можете найти больше информации о поведении PID 1 в этой статье: https://hackernoon.com/my-process-became-pid-1-and-now-signals-behave-strangely-b05c52cc551c

...