Системные выходы со статусом = 209 / STDOUT - PullRequest
0 голосов
/ 21 января 2019

Сценарий

У меня есть системный файл, который я хочу запустить условно, но только если для переменной среды ISCAPTUREPOD задано значение true.

У меня есть контейнеркоторый запускает две службы при запуске, но есть особый сценарий, когда я хочу, чтобы только одна из служб работала.Я передаю переменную окружения через Kubernetes, которую я хочу использовать, чтобы контролировать, запускается ли второй сервис или нет.У меня есть скрипт с именем iscapturepod.sh, который проверяет переменную среды, и он является частью оператора ExecStartPre.Я хочу, чтобы сценарий выполнялся успешно, если для переменной среды ISCAPTUREPOD задано значение "True", и произойдет сбой, если он не существует или для него установлено значение, отличное от "True".

Проблема:

Независимо от того, что я делаю, ExecStartPre не работает.Я даже пытался заставить сценарий сказать exit 0.Это единственная вещь во всем сценарии только потому, что я хотел добиться успеха.Systemd по-прежнему не работает со статусом 209 / STDOUT.

Служба захвата Молоха:

[Unit]
Description=Moloch Capture
After=network.target

[Service]
Type=simple
Restart=on-failure
StandardOutput=tty
ExecStartPre= /bin/sh -c '/data/moloch/bin/iscapturepod.sh'
ExecStart=/bin/sh -c '/data/moloch/bin/moloch-capture -c MOLOCH_INSTALL_DIR/etc/config.ini ${OPTIONS} >> /data/moloch/logs/capture.log 2>&1'
LimitCORE=infinity
LimitMEMLOCK=infinity

[Install]
WantedBy=multi-user.target

Сценарий

#!/bin/bash

# This script checks to see whether this pod is or is not a capture pod
# Kubernetes will pass the ISCAPTUREPOD variable as an environment variable with
# value True to  those pods meant for capture and False for the viewer pod.
# This allows us to only use one container for both the viewer and capture pods
# The molochcapture service will run this in an ExecStartPre statement. If it
# throws an error this will prevent the molochcapture service from starting

if [[ ! -z "${ISCAPTUREPOD}" ]]; then  
  if [[ "${ISCAPTUREPOD}" == "True" ]]; then    
    echo This is a capture pod
    exit 0
  else    
    echo This is not a capture pod 1>&2    
    exit 1  
  fi
else  
  echo This is not a capture pod 1>$2  
  exit 1
fi

Согласно этот сайт 0 должен быть успешным.Однако, даже если я изменил сценарий на exit 0, я все равно получаю:

[root@sensor1 /]# systemctl status molochcapture
● molochcapture.service - Moloch Capture
   Loaded: loaded (/usr/lib/systemd/system/molochcapture.service; enabled; vendor preset: disabled)
   Active: failed (Result: start-limit) since Mon 2019-01-21 12:58:20 UTC; 1s ago
  Process: 281 ExecStartPre=/bin/sh -c /data/moloch/bin/iscapturepod.sh (code=exited, status=209/STDOUT)

Jan 21 12:58:20 sensor1.lan systemd[1]: Failed to start Moloch Capture.
Jan 21 12:58:20 sensor1.lan systemd[1]: Unit molochcapture.service entered failed state.
Jan 21 12:58:20 sensor1.lan systemd[1]: molochcapture.service failed.
Jan 21 12:58:20 sensor1.lan systemd[1]: molochcapture.service holdoff time over, scheduling restart.
Jan 21 12:58:20 sensor1.lan systemd[1]: Stopped Moloch Capture.
Jan 21 12:58:20 sensor1.lan systemd[1]: start request repeated too quickly for molochcapture.service
Jan 21 12:58:20 sensor1.lan systemd[1]: Failed to start Moloch Capture.
Jan 21 12:58:20 sensor1.lan systemd[1]: Unit molochcapture.service entered failed state.
Jan 21 12:58:20 sensor1.lan systemd[1]: molochcapture.service failed.

Я вручную проверил, что сценарий работает правильно и не имеет проблем.Kubernetes передает переменную среды, как и ожидалось, и сценарий возвращает «Это модуль захвата».Я подумал, что, возможно, это как-то связано с тем, что systemd не имеет доступа к STDOUT, но именно тогда я попытался просто exit 0, но он все равно не удался.

1 Ответ

0 голосов
/ 21 января 2019

Я получил служебный файл из общего шаблона Moloch и изменил его. Я не понял, что у него есть строка StandardOutput=tty. После того, как я заметил, что понял, что есть несколько типов StandardOutput, которые вы можете выбрать для служебных файлов. Они хорошо документированы здесь: https://www.freedesktop.org/software/systemd/man/systemd.exec.html. Изменение значения с tty для наследования решило проблему для меня.

Проблема заключалась в том, что я пытался вывести на несуществующую строку TTY, которая и вызывала ошибку.

Моя проблема была еще более усугублена, поскольку systemd не наследует среду от контейнера, поэтому сценарий точно отобразит этот сбой.

...