Это означало бы это, если произведено для which
не относится к терминалу, затем не обрабатывайте --read-alias
, --show-dot
и --show-tilde
.
Обычно, если к каналу, обычный файл и т.д.
which watch | foo # not a tty
which watch > foo # not a tty
which watch # tty
which watch >&2 # tty
Опции не распознаны под, например, debian:
Только что выяснил, что мне нужно использовать
Type=forking
, как описано в http://www.freedesktop.org/software/systemd/man/systemd.service.html .
Если задано разветвление, ожидается, что процесс, настроенный с помощью ExecStart =, вызовет fork () как часть своего запуска. Ожидается, что родительский процесс завершится после завершения запуска и настройки всех каналов связи . Потомок продолжает работать как главный процесс-демон . Это поведение традиционных демонов UNIX. Если используется этот параметр, рекомендуется также использовать параметр PIDFile = , чтобы systemd могла идентифицировать основной процесс демона. {{ 1}} systemd продолжит запуск последующих модулей, как только родительский процесс завершится.
Для socat я использую чистый systemd подход. Это пример последовательного шлейфа :
.[Unit]
Description=Socat Serial Loopback
#Before=my-other.service
[Service]
Type=simple
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=socat-serial-lo
ExecStart=/usr/bin/socat -d -d pty,raw,echo=0,link=/tmp/seriallo-a pty,raw,echo=0,link=/tmp/seriallo-b
Restart=always
[Install]
WantedBy=multi-user.target
Это можно записать в/etc/systemd/system/socat-serial-lo.service
(в Ubuntu 16.04+ ), а затем:
systemctl daemon-reload
systemctl start socat-serial-lo
systemctl enable socat-serial-lo # (to start it during bootup)
Одним из преимуществ этого метода является то, что командную строку, определенную в ExecStart
, можно протестировать непосредственно из командной строки без изменений.для проверки команды.