通过 crontab 启动的 LXC 控制脚本无法正常工作,但从 cmd 行使用时可以正常工作

通过 crontab 启动的 LXC 控制脚本无法正常工作,但从 cmd 行使用时可以正常工作

我有一个使用命名管道来控制容器的脚本。该脚本监视命名管道中的命令并执行输入到其输入中的任何内容。脚本必须以拥有容器的用户身份运行。任何其他用户都可以向脚本发送命令。

在命令行上执行时,脚本可以工作。但我希望它是一个守护进程,并在系统启动时自行启动。尝试将其设置为服务并使用设置用户 - 不起作用。尝试将其作为 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。

谢谢你们。

相关内容