0

ユーザー空間プロセスから Linux ボックスを再起動する必要があります。次の動作が必要です。

  1. ファイルシステムの同期
  2. プロセスを正常に停止しようとしたり、ランレベル 5/6 に移動したりしないでください。

これらの要件を一緒に達成できますか?

'b' を proc/sysrq-trigger に書き込む予定でした。より良い方法はありますか?(いいえ、それでは同期できません。)

ありがとう!

4

4 に答える 4

3

私はあなたがルートを持っていると仮定しています。

  • sysrq-trigger は問題ありません。最初に「s」を数回エコーする必要があります。これは「緊急同期」です。
  • shutdown(8) の「-n」オプションも確認できます。それはあなたが望むことをするための缶詰の方法です。SIGTERM、SIGKILL、同期、シャットダウン、または再起動を送信するだけです (-h または -r オプション)。

それが役立つことを願っています。

于 2009-05-12T15:04:51.380 に答える
2

では、sync(1) を実行し、-1 を強制終了し、再度同期し、-9 -1 を強制終了し、同期して、-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");

これにより、すべてのファイルシステムが同期され、すぐに再起動されます。sysrqbは同期しないことに注意してください。

于 2009-05-20T05:24:37.490 に答える