linux 无法从C++重新启动系统

mzsu5hc0  于 2022-11-22  发布在  Linux
关注(0)|答案(2)|浏览(258)

我有一个C++程序在Docker容器中运行。我想通过我的程序重新启动容器,但我不能。
停靠文件:

FROM gcc

WORKDIR /client
COPY . .

RUN apt-get update && apt-get install qt5-qmake qtbase5-dev libmosquitto-dev -y

RUN qmake mainapp.pro && make
RUN chmod +x docker-entrypoint.sh

docker-entrypoint.sh

#!/bin/bash
./mainapp -e

下面是我的重新启动功能(清除了不必要的代码):

Logger::getInstance()->write(QString("Sync"));
    sync();
    Logger::getInstance()->write(QString("Setuid"));
    setuid(0);
    Logger::getInstance()->write(QString("RB_AUTOBOOT"));
    reboot(RB_AUTOBOOT);
    Logger::getInstance()->write(QString("Reboot"));
    system("reboot");

我可以看到所有的输出,然后它打印一个错误消息。下面是错误消息:

System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
Failed to talk to init daemon.

我尝试从容器重新启动,但效果不佳:

root@93501f6d7fc8:/client# reboot
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
Failed to talk to init daemon.
root@93501f6d7fc8:/client# shutdown -r
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down

我已经搜索了这个问题,并尝试了大多数建议,但他们没有解决我的问题。
我愿意听取你的意见和建议。

new9mtju

new9mtju1#

system("reboot")尝试使用shell(可能不存在于您的docker容器中)来运行reboot命令(可能不存在于您的docker容器中)。此外,“重新启动”并不是一个明确定义的概念。您不能重新启动内核,因为它是共享的。docker容器是一个应用级容器。
要重新启动您的应用,以及扩展容器,只需使用docker restart=always,然后调用std::exit(0)以正常退出您的应用。

hts6caw3

hts6caw32#

谢谢你的回答。我把这个添加到我的docker compose yaml文件中:

privileged: true
    restart: always

之后,reboot(RB_AUTOBOOT);重新启动了我的容器,并成功启动了应用程序。

相关问题