我需要从用户空间进程重新启动 Linux 机器。我希望有以下行为:
- 同步文件系统
- 不要试图优雅地停止进程,转到运行级别 5/6 等,因为我认为事情很糟糕并且会失败
这些要求可以一起实现吗?
我打算在 proc/sysrq-trigger 中写一个“b”。有没有更好的办法?(不,那不会给我同步。)
谢谢!
我假设你有root。
希望有帮助。
好吧,执行sync(1),kill -1,再次同步,kill -9 -1,sync,poweroff -f。
我猜这应该可以解决问题!
这直接来自 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 触发重启。
在普通发行版上,最简单的方法是:
system("/sbin/reboot -f");
这将同步所有文件系统,然后立即重新启动。请注意 sysrq b 不会同步。