0

我需要从用户空间进程重新启动 Linux 机器。我希望有以下行为:

  1. 同步文件系统
  2. 不要试图优雅地停止进程,转到运行级别 5/6 等,因为我认为事情很糟糕并且会失败

这些要求可以一起实现吗?

我打算在 proc/sysrq-trigger 中写一个“b”。有没有更好的办法?(不,那不会给我同步。)

谢谢!

4

4 回答 4

3

我假设你有root。

  • sysrq-trigger 很好,你只需要先回显 's' 几次,这是一个“紧急同步”。
  • 您还可以查看 shutdown(8) 的“-n”选项。这是做你想做的事的罐头方法。它只是发送 SIGTERM、SIGKILL、同步并关闭或重新启动(-h 或 -r 选项。)

希望有帮助。

于 2009-05-12T15:04:51.380 回答
2

好吧,执行sync(1),kill -1,再次同步,kill -9 -1,sync,poweroff -f。

我猜这应该可以解决问题!

于 2009-05-12T15:05:00.490 回答
1

这直接来自 sys/reboot.h :

#ifndef _SYS_REBOOT_H
#define _SYS_REBOOT_H   1

#include <features.h>

/* Perform a hard reset now.  */
#define RB_AUTOBOOT     0x01234567

/* Halt the system.  */
#define RB_HALT_SYSTEM  0xcdef0123

/* Enable reboot using Ctrl-Alt-Delete keystroke.  */
#define RB_ENABLE_CAD   0x89abcdef

/* Disable reboot using Ctrl-Alt-Delete keystroke.  */
#define RB_DISABLE_CAD  0

/* Stop system and switch power off if possible.  */
#define RB_POWER_OFF    0x4321fedc

__BEGIN_DECLS

/* Reboot or halt the system.  */
extern int reboot (int __howto) __THROW;

__END_DECLS

#endif  /* _SYS_REBOOT_H */

我相信 RB_HALT_SYSTEM 会处理所有 sync() 等。我通常自己做,最后用 RB_AUTOBOOT 触发重启。

于 2009-05-20T05:20:36.107 回答
0

在普通发行版上,最简单的方法是:

system("/sbin/reboot -f");

这将同步所有文件系统,然后立即重新启动。请注意 sysrq b 不会同步。

于 2009-05-20T05:24:37.490 回答