Systemd 以 status=209/STDOUT 退出

Systemd exits with status=209/STDOUT

场景

我有一个 systemd 文件,我想有条件地 运行,但前提是环境变量 ISCAPTUREPOD 设置为 true。

我有一个容器,它在启动时 运行 有两个服务,但是有一个特殊的场景,我只想要 运行 中的一个服务。我正在通过 Kubernetes 传递一个环境变量,我想用它来控制第二个服务是否启动。我有一个名为 iscapturepod.sh 的脚本,它检查环境变量,它是 ExecStartPre 语句的一部分。我希望脚本在环境变量 ISCAPTUREPOD 设置为 "True" 时成功,如果它不存在或设置为 "True".

以外的值则失败

问题:

无论我做什么,ExecStartPre 都会失败。我什至试过让脚本说 exit 0。这是整个脚本中唯一的东西,因为我想强制成功。 Systemd 仍然失败,状态为 209/STDOUT。

Moloch 捕获服务:

[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>  
  exit 1
fi

根据this site 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 正在按预期传递环境变量和脚本 returns "This is a capture pod"。我认为这可能与无法访问 STDOUT 的 systemd 有关,但那是我尝试 exit 0 但仍然失败的时候。

我从一个通用的 Moloch 模板中获取了服务文件并对其进行了修改。我没有注意到它有行 StandardOutput=tty。在我注意到我意识到有多种类型的 StandardOutput 之后,您可以 select 用于服务文件。它们在此处有详细记录:https://www.freedesktop.org/software/systemd/man/systemd.exec.html。将值从 tty 更改为 inherit 为我解决了这个问题。

问题是我试图输出到一个不存在的 TTY 线路,这是导致抛出错误的原因。

我的问题更加复杂,因为 systemd 没有从容器继承环境,所以脚本会准确地显示这个失败。