GNU/Linux >> Tutoriales Linux >  >> Linux

¿Simula Stdin vacío en comando separado?

Quiero desconectar el comando con "comando &" al final, o con "comando nohup &", pero se detiene justo después de separarlo.

El comando es poco específico, si recibe eof en la entrada, se rompe, por lo que /dev/null como entrada conducirá al final y la solución que generalmente funciona:

$ command < /dev/null > /dev/null 2>&1 &

no funciona…

¿Hay otro dispositivo en Unix/Linux que pueda reemplazar /dev/null y comportarse como una entrada vacía, pero sin enviar eof?

(por cierto, el comando es una herramienta de multidifusión emcast muy útil, puedo intentar parchearlo yo mismo o encontrar una versión parcheada para este propósito... pero parece que el problema se puede resolver afuera)

Estoy agregando esta EDICIÓN para que mi pregunta sea más clara. Hice este programa en C de 2 líneas que funciona perfectamente:el nombre del programa es "donothing"

#include <unistd.h>
int main() {  while (1)  { sleep(10); } return 0; }

y es lo que estoy buscando, algún dispositivo/programa, que no haga nada, pero deje su salida estándar abierta. Ambos ("command &... disown" y "nohup command &") funcionan.

$ donothing | mycommand >/dev/null & 
$ disown %1

funciona bien, por lo que ahora la pregunta es solo:qué dispositivo/programa Unix se comporta como mi "no hacer nada".

Respuesta aceptada:

Para que su comando detecte eof , tiene que leer desde stdin. Entonces, presumiblemente, está esperando alguna entrada. Entonces parece que lo que necesita no es una entrada vacía (/dev/null está destinado exactamente para eso), pero la entrada nunca llega.

Se puede simular con una tubería en la que nadie escribirá nunca en el otro extremo como:

sleep 999999999 | the-command

O para evitar tener que ejecutar ese sleep adicional comando, podría hacerse con una canalización con nombre:

fifo=$(mktemp -u) &&
  mkfifo "$fifo" &&
  (rm "$fifo" && the-command <&3 3<&- &) 3<> "$fifo"

Aquí usando un descriptor de archivo intermediario para evitar el hecho de que el shell conecta stdin a /dev/null implícitamente cuando inicia un comando con & (a menos que agregue una redirección estándar explícita como nuestro <&3 aquí).

En Linux (y probablemente solo en Linux), también puede hacer:

the-command < /dev/fd/1 3>&1 > /dev/null | :

/dev/fd/1 donde fd 1 está conectado a una tubería, en Linux, se comporta como una tubería con nombre. Es decir, cuando lo abre en modo de lectura, obtiene el extremo de lectura de la tubería.

Entonces, arriba, fd 0 se conectará al extremo de lectura de una tubería cuyo otro extremo está en el fd 3 de the-command . Porque the-command no va a escribir nada en su fd 3, cualquier read el intento en fd 0 se bloqueará (o una lectura sin bloqueo regresará con no hay nada que leer todavía , o una selección/encuesta devolverá nada para leer ya sea como the-command probablemente está haciendo si está haciendo algo más que esperar una entrada que nunca llega).

Relacionado:¿Cómo obtener el autocompletado de estilo bash en zsh (para el comando git)?
Linux
  1. Linux:¿Diferencia entre /dev/console, /dev/tty y /dev/tty0?

  2. ¿Qué son los archivos /dev/zero y /dev/null en Linux?

  3. DD de /dev/zero a /dev/null... lo que realmente sucede

  4. el uso de < /dev/null &en la línea de comandos

  5. Cómo usa Linux /dev/tty y /dev/tty0

/dev/null en Linux

pantalla No se puede abrir su terminal '/dev/pts/0' - verifique

¿Cuándo debo usar /dev/shm/ y cuándo debo usar /tmp/?

Linux:diferencia entre /dev/console, /dev/tty y /dev/tty0

kernel:deshabilitar /dev/kmem y /dev/mem

¿Por qué se requieren < o > para usar /dev/tcp?