ユーザー空間プロセスから Linux ボックスを再起動する必要があります。次の動作が必要です。
- ファイルシステムの同期
- プロセスを正常に停止しようとしたり、ランレベル 5/6 に移動したりしないでください。
これらの要件を一緒に達成できますか?
'b' を proc/sysrq-trigger に書き込む予定でした。より良い方法はありますか?(いいえ、それでは同期できません。)
ありがとう!
私はあなたがルートを持っていると仮定しています。
それが役立つことを願っています。
では、sync(1) を実行し、-1 を強制終了し、再度同期し、-9 -1 を強制終了し、同期して、-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");
これにより、すべてのファイルシステムが同期され、すぐに再起動されます。sysrqbは同期しないことに注意してください。