Назад | Перейти на главную страницу

Systemd выходит из сценариев bash, которые выполняют команды, приводящие к сбою, вместо продолжения

Я пытаюсь получить сценарий, который подталкивает мой системный журнал в CoreOS к журналам. Чтобы компенсировать тот факт, что экземпляры не имеют подключения к Интернету сразу после запуска на AWS, я вставил команду в цикл while.

При запуске сценария из командной строки цикл while работает нормально. Но когда systemd запускает этот сценарий, он немедленно завершает работу по истечении времени ожидания netcat, поэтому у него никогда не будет возможности повторить попытку.

Есть ли способ заставить systemd быть менее агрессивным при выходе из скрипта?

вывод systemd, никогда не попадает в "спящий netcat"

Jul 23 22:26:21 core-01 systemd[1]: Starting Push journal logs to logentries.com...
Jul 23 22:26:21 core-01 systemd[1]: Started Push journal logs to logentries.com.
Jul 23 22:26:21 core-01 bash[880]: trying netcat
Jul 23 22:26:31 core-01 bash[880]: Ncat: Connection timed out.

journal2logentries.sh

#!/usr/bin/env bash
token=logentriestoken
while true
do
  echo 'trying netcat'
  journalctl -o short -f | awk -v token=$token '{ print token, $0; fflush(); }' | ncat --ssl --ssl-verify data.logentries.com 20000
  echo 'sleeping netcat'
  sleep 30s
done

logentries.service

[Unit] 
Description=Push journal logs to logentries.com 
After=systemd-journald.service
After=systemd-networkd.service

[Service]
Restart=always
ExecStart=/bin/bash /home/core/journal2logentries.sh

[Install]
WantedBy=multi-user.target

Обновить:

Похоже, что настоящая проблема в том, что когда netcat умирает, systemd вещи, процесс / bin / sh все еще выполняется. Примечание: URL-адрес намеренно неверен для тестирования

logentries.service - Push journal logs to logentries.com
   Loaded: loaded (/etc/systemd/system/logentries.service; disabled)
   Active: active (running) since Mon 2014-07-28 17:12:04 UTC; 1min 48s ago
 Main PID: 16305 (sh)
   CGroup: /system.slice/logentries.service
           ├─16305 /bin/sh -c journalctl -o short -f | awk -v token=token_here '{ print token, $0; fflush(); }' | ncat --ssl --ssl-verify -vv ogentries.com 20000
           ├─16306 journalctl -o short -f
           └─16307 awk -v token=80b4b3b6-1315-4b76-ac69-f530c1dec47f { print token, $0; fflush(); }

Jul 28 17:12:04 ip-172-31-19-155.us-west-2.compute.internal systemd[1]: logentries.service holdoff time over, scheduling restart.
Jul 28 17:12:04 ip-172-31-19-155.us-west-2.compute.internal systemd[1]: Stopping Push journal logs to logentries.com...
Jul 28 17:12:04 ip-172-31-19-155.us-west-2.compute.internal systemd[1]: Starting Push journal logs to logentries.com...
Jul 28 17:12:04 ip-172-31-19-155.us-west-2.compute.internal systemd[1]: Started Push journal logs to logentries.com.
Jul 28 17:12:04 ip-172-31-19-155.us-west-2.compute.internal sh[16305]: Ncat: Version 6.40 ( http://nmap.org/ncat )
Jul 28 17:12:04 ip-172-31-19-155.us-west-2.compute.internal sh[16305]: Ncat: Could not resolve hostname "ogentries.com": Name or service not known. QUITTING.

Перешли с труб на замещение процесса.

http://paraf.in/abs-guide/process-sub.html

https://stackoverflow.com/a/18360260/136408

Вот файл модуля, который я придумал:

logentries.service

[Unit]
Description=Push journal logs to logentries.com
After=systemd-journald.service
After=systemd-networkd.service

[Service]
Restart=always
RestartSec=30s
ExecStart=/bin/bash -c "ncat --ssl --ssl-verify data.logentries.com 20000 < <(awk -v token=token_here '{ print token, $0; fflush(); }' < <(journalctl -o short -f))"

[Install]
WantedBy=multi-user.target

Вы пробовали использовать || /bin/true вернуть нулевой статус выхода по вашей команде, чтобы systemd не обнаружил плохой статус выхода?

journalctl -o short -f | awk -v token=$token '{ print token, $0; fflush(); }' | ncat --ssl --ssl-verify data.logentries.com 20000 || /bin/true