我有一个使用命名管道来控制容器的脚本。该脚本监视命名管道中的命令并执行输入到其输入中的任何内容。脚本必须以拥有容器的用户身份运行。任何其他用户都可以向脚本发送命令。
在命令行上执行时,脚本可以工作。但我希望它是一个守护进程,并在系统启动时自行启动。尝试将其设置为服务并使用设置用户 - 不起作用。尝试将其作为 cron 作业 -@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
再次,shutdown 命令可以正常工作 - 其他命令则不行。从 cmd 行运行时,脚本运行正常。
答案1
我怀疑您想要做的是启动守护进程的容器。
-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
}
我怀疑出现失败消息的原因是,当您将其作为停止/启动脚本运行时,没有可用于 lxc* 连接到您的容器的 TTY,因此它们无法启动。
参考
答案2
尝试了这些建议后,我得出结论,这可能是我的系统上的某种错误或深奥的配置特性 ( Linux main 4.18.0-17-generic #18~18.04.1-Ubuntu
)。无论如何,追查它可能不值得。
如果有人遇到类似的事情,也许他们应该寻求解决方法。这是我最终做的:
- 重新编写脚本,以便无需命名管道即可使用
- 只需通过本地主机上的 ssh 命令调用它即可:
ssh conts@ubuntu 'cont-control.sh shutdown'
。
使用authorized_keys中的证书,其开销为0。
谢谢你们。