GNU/Linux >> Znalost Linux >  >> Linux

Simulovat prázdný Stdin do odděleného příkazu?

Chci odpojit příkaz buď pomocí ‚příkaz &‘ na konci, nebo ‚nohup příkaz &‘, ale zastaví se hned po jeho odpojení.

příkaz je málo konkrétní, pokud na vstupu obdrží eof, přeruší se, takže /dev/null jako vstup povede ke konci a řešení, které obvykle funguje:

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

nefunguje…

existuje v unixu/linuxu jiné zařízení, které může nahradit /dev/null a chovat se jako prázdný vstup, ale neposílat eof.

(mimochodem, command je velmi užitečný multicastingový nástroj emcast, můžu si to zkusit opravit sám, nebo najít opravenou verzi pro tento účel... ale zdá se, že problém lze vyřešit venku)

Přidávám tuto EDIT, aby byl můj dotaz jasnější. Vytvořil jsem tento program v C se 2 řádky, který funguje perfektně:název programu je „donothing“

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

a to je to, co hledám, nějaké zařízení/program, který nic nedělá, ale nechá otevřený svůj stdout. Oba („příkaz &… disown“ a „příkaz nohup &“) fungují.

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

funguje dobře, takže nyní je otázkou pouze:jaké unixové zařízení/program se chová jako moje „nedělání“.

Přijatá odpověď:

Aby váš příkaz detekoval eof , musí se číst ze stdin. Takže pravděpodobně očekává nějaký vstup. Zní to tedy, že to, co potřebujete, není prázdný vstup (/dev/null je přesně k tomu určen), ale vstup, který nikdy nepřijde.

Lze to simulovat rourou, kde nikdo nikdy nebude psát na druhý konec jako:

sleep 999999999 | the-command

Nebo abyste nemuseli spouštět tento extra sleep lze to provést pomocí pojmenovaného kanálu:

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

Zde pomocí zprostředkujícího deskriptoru souboru obejít skutečnost, že shell spojuje stdin s /dev/null implicitně, když spustíte příkaz pomocí & (pokud nepřidáte explicitní přesměrování stdin, jako je naše <&3 zde).

V systému Linux (a pravděpodobně pouze v systému Linux) můžete také:

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

/dev/fd/1 kde je fd 1 připojen k rouře, v Linuxu se chová jako pojmenovaná roura. To znamená, že když jej otevřete v režimu čtení, získáte čtecí konec roury.

Takže výše, fd 0 bude připojeno ke čtecímu konci roury, jejíž druhý konec je na fd 3 the-command . Protože the-command nebude na svém fd 3 nic zapisovat, žádné read pokus o fd 0 se zablokuje (nebo se vrátí neblokující čtení s zatím není co číst nebo výběr/dotaz vrátí nic ke čtení buď jako the-command pravděpodobně dělá, pokud dělá něco jiného než čekání na vstup, který nikdy nepřijde).

Související:Jak získat automatické dokončování ve stylu bash v zsh (pro příkaz git)?
Linux
  1. Co jsou soubory /dev/zero a /dev/null v Linuxu

  2. Jak kódovat base64 /dev/random nebo /dev/urandom?

  3. obrazovka Nelze otevřít váš terminál '/dev/pts/0' - zkontrolujte prosím

  1. Kdy mám použít /dev/shm/ a kdy /tmp/?

  2. DD z /dev/zero do /dev/null...co se vlastně stane

  3. použití < /dev/null &v příkazovém řádku

  1. Linux:Rozdíl mezi /dev/console, /dev/tty a /dev/tty0?

  2. Jak přenosné jsou /dev/stdin, /dev/stdout a /dev/stderr?

  3. Vytvořte virtuální blokové zařízení, které zapisuje do /dev/null