У меня есть сценарий, который использует именованные каналы для управления контейнерами. Мониторы сценариев именованный канал для команд и выполняет то, что питается в его вход. Сценарий должен работать как пользователь, который владеет контейнерами. Любой другой пользователь может отправить команды в сценарий.
Сценарий работает при выполнении на командной строке. Но я хочу, чтобы это было демоном и запустило себя на начальной загрузке системы. Испытанная установка его как услуга с пользователем аппарата - не работа. Попробованный это как задание крона - @restart /home/conts/cont-control.sh
- это также не работает. Именованный канал создается, shutdown
работы части хорошо, но другие - не делают.
Кто-то может предложить, где может быть проблема?
Вот фактический сценарий:
#!/usr/bin/env bash
input=/tmp/container-control
mkfifo $input
chmod o+w $input
trap "rm $input" EXIT
stopAllContainers () {
for i in $(lxc-ls); do
lxc-stop -n $i
done
}
startContainerGroup () {
lxc-autostart -g $1
}
startContainer () {
lxc-start -n $1
}
stopContainer () {
lxc-stop -n $1
}
while true; do if read -r -a cmd <$input; then
case ${cmd[0]} in
"shutdown")
stopAllContainers
echo "Shutting down containers ... done" > $input
;;
"start-group")
startContainerGroup ${cmd[1]}
echo "Starting group ${cmd[1]} ... done" > $input
;;
"start")
startContainer ${cmd[1]}
echo "Starting ${cmd[1]} container ... done" > $input
;;
"stop")
stopContainer ${cmd[1]}
echo "Stopping ${cmd[1]} container ... done" > $input
;;
*)
echo "Unsupported command: ${cmd[0]} with argument: ${cmd[1]} ... fail" > $input
;;
esac
fi
done
Править: После редактирования crontab так, чтобы это произвело ошибки в файл, кажется, что проблемой является связанный lxc. Вот вывод при попытке запустить контейнер, названный mysql-dev:
lxc-start: mysql-dev: lxccontainer.c: wait_on_daemonized_start: 833 No such file or directory - Failed to receive the container state
lxc-start: mysql-dev: tools/lxc_start.c: main: 330 The container failed to start
lxc-start: mysql-dev: tools/lxc_start.c: main: 333 To get more details, run the container in foreground mode
lxc-start: mysql-dev: tools/lxc_start.c: main: 336 Additional information can be obtained by setting the --logfile and --logpriority options
Снова, команда завершения работы работает хорошо - другие не делают. Когда выполнено от cmd строки, сценарий обычно ведет себя.
После опробования предложений, я пришел к выводу, что это, вероятно, какая-то ошибка или особенность эзотерической конфигурации в моей системе (Linux main 4.18.0-17-generic #18~18.04.1-Ubuntu
). В любом случае, выследить его, наверное, не стоит.
В случае, если кто-то испытывает нечто подобное, возможно, он должен согласиться на обходной путь. Это то, что я в конечном итоге сделал:
ssh conts@ubuntu 'cont-control.sh shutdown'
. С сертификатом в авторизованных ключах у него 0 служебных данных.
Спасибо всем.
Я подозреваю, что вы хотите запустить демонизированные контейнеры.
-d, --daemon
Run the container as a daemon. As the container has no more tty, if an error
occurs nothing will be displayed, the log file can be used to check the error.
(This is the default mode)
Итак, в вашем примере что-то вроде этого:
startContainer () {
lxc-start -d -n $1
}
Сообщения об ошибках, я подозреваю, появляются, потому что, когда вы запускаете это как скрипт остановки / запуска, TTY для lxc недоступен подключиться к вашим контейнерам, и поэтому они не запускаются.