2011-09-01 14 views
6

Tengo algunos flujos de trabajo en los que me gustaría que R detenga la máquina Linux en la que se ejecuta después de completar un script. No puedo pensar en dos formas similares de hacer esto:haz que R detenga la máquina EC2 que se ejecuta en

  1. ejecutar R como root y luego llamar system("halt")
  2. ejecutar R a partir de un script de shell raíz (podría ejecutar el script R como cualquier usuario) y luego tener el script de shell ejecute halt después de que se complete el bit R.

¿Hay otras formas fáciles de hacerlo?

El caso de uso aquí es para las secuencias de comandos que se ejecutan en AWS donde me gustaría que la instancia se detenga después de la finalización del script para que no me cobren por el tiempo de la máquina. Mi instancia que uso para el análisis de datos es una instancia respaldada por EBS, así que no quiero terminarla, simplemente suspender. La emisión de un comando de detención desde el interior de la instancia tiene el mismo efecto que detener/suspender desde la consola de AWS.

+3

¡Qué extraño! Puedo enviarte parte de mi código y si puedes averiguar cómo hacerlo * detener * detener una máquina, estaré muy feliz. :) – Iterator

+0

¿Puedes aclarar varias cosas: (1) ¿Estás usando una instancia respaldada por EBS o S3? (Si usa EBS, ¿tiene la intención de finalizar o detener la instancia?) (2) ¿Cómo se usa R? Interactivamente, a través de una secuencia de comandos, a través de uno de estos paquetes de Hadoop, a través de "datos de usuario" de la instancia, o de algún otro modo. – Iterator

+2

Gran extensión de 'sudo make sandwich' que incluso limpia la cocina. Bonito. –

Respuesta

8

Estoy impresionado de que funcione. (Para cualquier otra persona sorprendida de que una instancia pueda detenerse, consulte las notas 1 & 2.)

También puede intentar "sudo detener", ya que no tendría que ejecutar como usuario raíz, siempre y cuando el usuario cuenta que ejecuta R es capaz de ejecutar sudo. Esto es bastante común en muchas AMI en EC2.

Tenga cuidado con lo que constituye una suposición de dejar de fumar R - Créalo o no, uno puede bloquear R. Puede ser mejor tener un script separado que mire el R pid y, una vez que ese PID deje de estar activo, termine la instancia. Hacer este comando dentro de R significa que si R falla, nunca llega a la llamada para detenerse. Si lo llamas desde otra secuencia de comandos, eso también puede ser peligroso. Si conoce bien Linux, lo que está buscando es que el PID inicie R, que puede pasar a otra secuencia de comandos que compruebe ps, digamos cada 1 segundo, y luego finaliza la instancia una vez que el PID ya no se está ejecutando.

Creo que una mejor solución es utilizar las herramientas de la API EC2 (ver: http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ para la documentación) para terminar O instancias de detención. Hay una diferencia entre los dos, y es importante si su instancia tiene respaldo EBS o respaldo S3. No necesita ejecutar como root para terminar la instancia; el hecho de que tenga la clave privada y el certificado muestra a Amazon que usted es el BOSS, muy por encima del hoi polloi que simplemente tiene acceso de root en su instancia.

Dado que estas credenciales se pueden utilizar para travesuras, tenga cuidado con la ejecución de las herramientas API desde un servidor determinado, necesitará su certificado y clave privada en el servidor. Esa es una mala idea en caso de que tenga un problema de seguridad. Sería mejor enviar un mensaje a un servidor maestro y hacer que apague la instancia. Si tiene mensajería configurada de alguna manera entre las instancias, esto puede hacer todo el trabajo por usted.


Nota 1: Eric Hammond reports que el halt sólo habrá suspender una instancia de EBS, por lo que aún tiene las tarifas de almacenamiento. Si comienza muchas de esas instancias, esto puede complicar las cosas. Tu pregunta original no está clara sobre si quieres terminar o detener una instancia.Él tiene otros buenos consejos on this page

Nota 2: A short thread on the EC2 developers forum da consejos para Linux & Usuarios de Windows.

Nota 3: Las instancias de EBS se facturan por horas parciales, incluso cuando se reinician. (Consulte this thread from the developer forum.) Tener una suspensión automática cerca de la hora puede ser útil, suponiendo que el proceso R no funciona, en caso de que uno pueda volver a realizar la tarea de esa instancia (es decir, para guardar al no reiniciar). Otras herramientas útiles a considerar: setTimeLimit y setSessionTimeLimit, y varias herramientas de punto de control (tengo una Q que mentions a couple). Usar un auto-kill es útil si uno tiene un código que se comporta mal.

Nota 4: Recientemente me enteré del comando shutdown en el paquete fun. Esto es multiplataforma. Consulte this blog post para obtener comentarios, y el código es here. Cosas peligrosas, pero podría ser útil si quieres adaptarte a Windows. No lo he probado, sin embargo.


actualización 1. Otros tres ideas:

  • Usted podría utilizar .Last() y runLast = TRUE para q() y quit(), lo que podría cerrar la instancia.
  • Si usa littler o una secuencia de comandos que invoca la secuencia de comandos a través de Rscript, las mismas funciones de línea de comandos podrían ser utilizadas.
  • Mi paquete favorito de hoy, tcltk2 tiene un mecanismo de temporizador ordenado, llamado tclTaskSchedule() que se puede utilizar para programar la ejecución de una expresión. A continuación, podría volverse loco con la ejecución de cosas justo antes de que haya transcurrido un intervalo de una hora.
+0

no ... detenerse detiene la instancia. Al menos, así es como se configuran mis instancias :) –

+0

tenga en cuenta que quiero "detener" no "terminar" una instancia. Estoy usando una instancia respaldada por EBS, así que solo quiero detenerla para preservar el estado. Si lo terminara, perdería el estado. –

+0

'halt' debería ser el truco, o puede usar' ec2-stop-instances'. Me gusta lo que sugiere Eric Hammond, a través del comando 'at'. – Iterator

0

AFAIK esas formas que usted mencionó son las únicas. En cualquier caso, el script deberá ejecutarse como root para poder cerrar la máquina (si encuentra una forma de hacerlo sin root, posiblemente sea un exploit). Usted solicita una forma más fácil, pero el sistema ("detener") es solo una línea adicional al final de su secuencia de comandos.

1
system("echo 'rootpassword' | sudo halt") 

Sin embargo, el inconveniente es tener la contraseña de root en texto plano en el guión.

+1

NB: Puede que no haya una contraseña de root si el AMI o las cuentas no están configurados con una contraseña. Tal es la belleza de tener 17 toneladas de claves criptográficas sentadas y la alegría de dominar claves privadas, certificados, RSA, x.509 y más. – Iterator

+0

ese es un muy buen punto Iterator. Tengo mi instancia de análisis configurada con contraseñas, pero puede que no sea necesario. Gracias por el recordatorio. –

0

sudo es una opción: le permite ejecutar ciertos comandos sin pedir ninguna contraseña. Sólo hay que poner algo como esto en /etc/sudoers

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

(por supuesto la sustitución con el nombre de usuario que ejecuta R) y system('sudo halt') solo debería funcionar.

+0

@Iterator Gracias. – mbq

Cuestiones relacionadas