R остановит машину EC2, на которой он работает - PullRequest
7 голосов
/ 01 сентября 2011

У меня есть несколько рабочих процессов, в которых я хотел бы, чтобы R остановил машину Linux, на которой он работает, после завершения сценария.Я могу придумать два аналогичных способа сделать это:

  1. запустить R от имени root и затем вызвать system("halt")
  2. запустить R из сценария корневой оболочки (можно запустить сценарий R каклюбой пользователь) после этого запускает скрипт оболочки halt после завершения бита R.

Существуют ли другие простые способы сделать это?

Вариант использования здесь для сценариев, работающих на AWS, где я хотел бы, чтобы экземпляр был остановлен после завершения сценария, чтобы я неТариф за машинное время после выполнения задания.Мой экземпляр, который я использую для анализа данных, - это экземпляр EBS, поэтому я не хочу его прерывать, просто приостановить.Выполнение команды остановки изнутри экземпляра является тем же эффектом, что и остановка / приостановка из консоли AWS.

Ответы [ 4 ]

8 голосов
/ 01 сентября 2011

Я впечатлен, что работает.(Для всех, кто удивился, что экземпляр может остановиться сам, см. Примечания 1 и 2.)

Вы также можете попробовать "sudo halt", так как вам не нужно запускаться от имени пользователя root, еслиучетная запись пользователя под управлением R может запускать sudo.Это довольно часто встречается во многих AMI на EC2.

Будьте осторожны с тем, что представляет собой предположение о выходе из R - хотите верьте, хотите нет, может произойти сбой R. Возможно, лучше иметь отдельный скрипт, который просматриваетR pid и, когда этот PID больше не активен, завершает экземпляр.Выполнение этой команды внутри R означает, что в случае сбоя R он никогда не достигнет вызова остановки.Если вы вызываете его из другого скрипта, это тоже может быть опасно.Если вы хорошо знаете Linux, вам нужен PID от запуска R, который вы можете передать другому сценарию, который проверяет ps, скажем, каждую 1 секунду, а затем завершает экземпляр, когда PID больше не работает.

Я думаю, что лучшим решением будет использование инструментов API EC2 (см. Документацию: http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/) для прекращения ИЛИ остановки экземпляров.Между этими двумя понятиями есть разница, и имеет значение, поддерживается ли ваш экземпляр EBS или S3.Вам не нужно запускаться от имени root, чтобы завершить работу экземпляра - тот факт, что у вас есть закрытый ключ и сертификат, показывает Amazon, что вы БОСС, намного выше тех, кто просто имеет root-доступ на вашем экземпляре.

Поскольку эти учетные данные могут быть использованы для получения информации, будьте осторожны при запуске инструментов API с данного сервера, вам потребуется ваш сертификат и закрытый ключ на сервере.Это плохая идея, если у вас есть проблемы с безопасностью.Было бы лучше отправить сообщение на главный сервер и закрыть его.Если вы настроили обмен сообщениями между экземплярами, это может сделать всю работу за вас.


Примечание 1: Эрик Хаммонд сообщает , что halt только приостановитEBS, так что у вас все еще есть плата за хранение.Если вам случится запустить много таких примеров, это может привести к беспорядку.Ваш первоначальный вопрос кажется неясным, хотите ли вы прекратить или остановить инстанцию.У него есть другие полезные советы на этой странице

Примечание 2. Короткая ветка на форуме разработчиков EC2 дает советы для пользователей Linux и Windows.

Примечание 3: Экземпляры EBS оплачиваются за неполные часы, даже при перезапуске.(См. эту ветку на форуме разработчиков .) Автоматическое приостановление, близкое к часовой отметке, может быть полезным, если предположить, что процесс R не работает, в случае, если можно повторно выполнить этот экземпляр (т.е.сэкономить на перезапуске).Другие полезные инструменты для рассмотрения: setTimeLimit и setSessionTimeLimit, а также различные инструменты для контрольных точек (у меня есть Q, в котором упоминает пару ).Использование авто-уничтожения полезно, если у вас есть потенциально плохой код.

Примечание 4: Я недавно узнал о команде shutdown в пакете fun.Это мультиплатформенная.См. этот пост для комментариев, код здесь .Опасный материал, но он может быть полезен, если вы хотите адаптироваться к Windows.Я не пробовал, однако.


Обновление 1. Еще три идеи:

  • Вы можете использовать .Last() и runLast = TRUE для q() и quit(), который может закрыть экземпляр.
  • При использовании littler или скрипта, который вызывает скрипт через Rscript, могут использоваться те же функции командной строки.
  • Мой любимый на сегодняшний день пакет, tcltk2 имеет механизм аккуратного таймера, называемыйtclTaskSchedule(), который можно использовать для планирования выполнения выражения.После этого вы можете сойти с ума от исполнения материала незадолго до истечения часового интервала.
1 голос
/ 01 сентября 2011
system("echo 'rootpassword' | sudo halt")

Тем не менее, недостатком является наличие вашего корневого пароля в тексте в виде простого текста.

0 голосов
/ 03 сентября 2011

sudo является опцией - она ​​позволяет запускать определенные команды без запроса пароля.Просто поместите что-то вроде этого в /etc/sudoers

<username> ALL=(ALL) PASSWD: ALL, NOPASSWD: /sbin/halt

(конечно, заменив его именем пользователя, выполняющего R), и system('sudo halt') должно просто работать.

0 голосов
/ 01 сентября 2011

AFAIK эти способы, которые вы упомянули, являются единственными.В любом случае сценарий должен быть запущен от имени пользователя root, чтобы иметь возможность выключить компьютер (если вы найдете способ сделать это без root, это, возможно, эксплойт).Вы просите более простой способ, но система ("останов") - это просто дополнительная строка в конце вашего скрипта.

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