перезагрузите Linux окно из пространства пользователя - PullRequest
0 голосов
/ 12 мая 2009

Мне нужно перезагрузить Linux-систему из пользовательского пространства. Я хочу иметь следующее поведение:

  1. синхронизация файловых систем
  2. не пытайтесь корректно останавливать процессы, переходите на уровень выполнения 5/6 и т. Д., Поскольку я предполагаю, что все плохо, и это не удастся

Можно ли вообще выполнить эти требования вместе?

Я планировал записать 'b' в proc / sysrq-trigger. Есть ли способ лучше? (Нет, это не даст мне синхронизацию.)

Спасибо!

Ответы [ 4 ]

3 голосов
/ 12 мая 2009

Я предполагаю, что у вас есть root.

  • С sysrq-триггером все в порядке, вам просто нужно сначала вставить в него пару раз, что является «Аварийной синхронизацией».
  • Вы также можете проверить опцию '-n' для выключения (8). Это консервированный способ делать то, что вы хотите. Он просто отправляет SIGTERM, SIGKILL, синхронизирует и выключает или перезагружает (опция -h или -r.)

Надеюсь, это поможет.

2 голосов
/ 12 мая 2009

Хорошо, сделайте синхронизацию (1), убейте -1, снова синхронизируйте, убейте -9 -1, синхронизируйте, poweroff -f.

Думаю, это должно сработать!

1 голос
/ 20 мая 2009

Это напрямую из 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.

0 голосов
/ 20 мая 2009

В обычном дистрибутиве самый простой способ сделать это:

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

Это синхронизирует все файловые системы, а затем сразу же перезагружается. Обратите внимание, что sysrq b НЕ будет синхронизироваться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...