A veces ejecuta un programa desde la terminal, por ejemplo, lxpanel
† . El terminal no lo regresará al indicador, se bloqueará. Puede presionar Ctrl+ Cpara volver al indicador, pero eso matará lxpanel
. Sin embargo, presionar Alt+ F2(que abre una ventana para tomar un comando) y ejecutar lxpanel
funciona correctamente.
¿Por qué es esto? ¿Qué es diferente entre ejecutar un comando desde la terminal y desde la ventana 'ejecutar' que aparece cuando presiona Alt+ F2?
† lxpanel aquí solo se usó como ejemplo. He experimentado esto con múltiples programas
shell
command-line
jobs
sqram
fuente
fuente
screen
) puede, entre otras cosas, usarse para "envolver" procesos de ejecución más larga. Puede desconectarse de él, volver al shell, luego volver a conectar y ver la salida del proceso en ejecución. La reconexión incluso se puede hacer desde otro terminal, SSH, etc. También puede haber otros programas que le permitan hacer este tipo de cosas.Respuestas:
Por defecto, el terminal ejecutará el programa en primer plano, por lo que no terminará en el shell hasta que el programa haya finalizado. Esto es útil para los programas que leen desde stdin y / o escriben en stdout; generalmente no desea que muchos de ellos se ejecuten a la vez. Si desea que un programa se ejecute en segundo plano, puede iniciarlo así:
O si ya se está ejecutando, puede suspenderlo con Ctrl+ Zy luego ejecutarlo
bg
para moverlo a segundo plano. De cualquier manera, terminará con un nuevo indicador de shell, pero el programa aún se está ejecutando y su salida aparecerá en la terminal (por lo que puede aparecer repentinamente mientras está escribiendo)Algunos programas (típicamente demonios) bifurcarán un proceso separado cuando comiencen, y luego dejarán que el proceso principal salga inmediatamente. Esto permite que el programa siga ejecutándose sin bloquear su shell
fuente
Cuando inicia un programa en una terminal, la terminal se "colgará" hasta que su programa se detenga. Al presionar Ctrl+ c, está cerrando su programa y, por lo tanto, vuelve al indicador. Verá esto con todas las aplicaciones GUI, pruebe Firefox, por ejemplo.
Cuando utiliza algún otro método, como Alt + F2 o hace clic en los menús, su programa se inicia en segundo plano para que no ocurra nada extraño (y de todos modos no hay un símbolo del sistema).
Si aún desea iniciar aplicaciones GUI desde la terminal, agregue
&
al final de su comando, asíEsto le dice a la terminal que se ejecute
lxpanel
en segundo plano y le dé otro aviso de inmediato.fuente
Los programas se ejecutan a través de un shell que se ejecuta en primer plano de ese shell de forma predeterminada. Esto hace que el shell suspenda la operación y dirija stdin / stdout / sterr desde el terminal al programa. Los programas que se ejecutan a través del entorno de escritorio se bifurcan , lo que hace que se ejecuten independientemente del programa que los ejecutó. Esto se puede simular en la mayoría de los shells agregando
&
a al comando, aunque esto aún conectará std * al terminal (aunque leer desde stdin en un programa en segundo plano tiene más complicaciones).fuente
Los fondos & bien, a excepción de los programas que regresan que requieren interacción con la consola más tarde (por ejemplo, una "apt -y update &" que eventualmente ingresa al estado STOP ya que quiere preguntarle al usuario una pregunta "¿realmente realmente forzar?" Mucho más tarde .... cuando ya nadie está mirando).
Para tapar ese agujero e informar el proceso, un terminal realmente nunca estará disponible para él, agrego un <& - a algunos de mis comandos, separándolos por completo del terminal activo diciéndoles que STDIN ya no es posible. Asegúrese de que / bin / bash es su shell si lo usa. El script continuará registrando cualquier error relacionado con la ausencia de pseudoterminal disponible para emitir cualquier aviso.
Por ejemplo:
es mi mejor manera de desvincularse de la sesión actual de terminal. Tanto STDOUT como STDERR se registran en runme.log, no importará si su consola o shell finalizan antes o si cierra sesión / su en una cuenta diferente (no hay basura en la terminal de runme), y gracias a repudiar incluso al padre-hijo La relación PID se elimina.
ACTUALIZACIÓN: incluso con eso he tenido problemas con un semáforo que lo asocia con el nombre del padre original, así que ahora recomiendo en su lugar:
Por supuesto, elimine &> si desea que se le envíe por correo electrónico la salida de CRON, o redirija todo a / dev / null en lugar de un archivo.
fuente
at now <<< "(cmd1; cmd2; etc.) &> logfile.log"