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 没有从容器继承环境,所以脚本会准确地显示这个失败。
场景
我有一个 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 没有从容器继承环境,所以脚本会准确地显示这个失败。