如何从初始PID名称空间以外的PID名称空间以及初始PID名称空间调用reboot()?

时间:2018-12-19 19:52:26

标签: linux reboot

manpage of reboot()

  

PID名称空间内的行为

     

从Linux 3.4开始,如果从其他PID空间中调用reboot()
  比具有列出的cmd值之一的初始PID名称空间

  在下面,它执行该名称空间的“重新启动”:“ init”过程
  PID名称空间的立即终止,并具有效果
  pid_namespaces(7)中所述。

     

在以下位置调用reboot()时可以在cmd中提供的值   这种情况如下:

     

LINUX_REBOOT_CMD_RESTART,LINUX_REBOOT_CMD_RESTART2             “ init”过程终止,并且父级中的wait(2)             过程报告该儿童被SIGHUP杀害             信号。

     

LINUX_REBOOT_CMD_POWER_OFF,LINUX_REBOOT_CMD_HALT             “ init”过程终止,并且父级中的wait(2)             过程报告该儿童被SIGINT杀害             信号。

     

对于其他cmd值,reboot()返回-1,并且errno设置为
  EINVAL。

阅读its manpage后,我对PID名称空间的理解有限。我想知道如何调用reboot()

  • 来自初始PID名称空间以外的PID名称空间,以及
  • 从初始PID名称空间开始?

谢谢。

1 个答案:

答案 0 :(得分:0)

您可以使用nsenter进入其他PID。 要从初始PID名称空间以外的PID执行重新引导,请执行以下操作:

TreeSet<Sorted> t1 = new TreeSet<>(Comparator.comparingInt(s -> s.num));

如果目标PID为1:

/usr/bin/nsenter -m/proc/PID/ns/mnt reboot

第二个问题与简单地调用/usr/bin/nsenter -m/proc/1/ns/mnt reboot 相同,因为它将获得当前的PID上下文。