GNU/Linux >> Tutoriels Linux >  >> Linux

Simuler Stdin vide en commande détachée ?

je veux détacher la commande soit avec 'command &' à la fin, soit avec 'nohup command &', mais elle s'arrête juste après l'avoir détachée.

La commande est peu spécifique, si elle reçoit eof en entrée, elle se casse donc /dev/null en entrée conduira à la fin et à la solution qui fonctionne habituellement :

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

ne fonctionne pas…

existe-t-il un autre périphérique sous unix/linux, qui peut remplacer /dev/null et se comporter comme une entrée vide, mais n'envoyant pas eof.

(au fait, la commande est un outil de multidiffusion très utile emcast, je peux essayer de le corriger moi-même, ou trouver une version corrigée à cet effet… mais il semble que le problème puisse être résolu à l'extérieur)

J'ajoute cet EDIT pour rendre ma question plus claire. J'ai fait ce programme C de 2 lignes qui fonctionne parfaitement :le nom du programme est "donothing"

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

et c'est ce que je recherche, un appareil/programme, qui ne fait rien, mais laisse sa sortie standard ouverte. Les deux ("commande &… désavouer" et "commande nohup &") fonctionnent.

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

fonctionne bien, alors maintenant la question est seulement :quel périphérique/programme Unix se comporte comme mon « rien ».

Réponse acceptée :

Pour que votre commande détecte eof , il doit lire à partir de stdin. Donc, on peut supposer qu'il attend des commentaires. Il semble donc que ce dont vous avez besoin n'est pas une entrée vide (/dev/null est exactement fait pour ça), mais une entrée qui ne vient jamais.

Il peut être simulé avec un tube où personne n'écrira jamais à l'autre bout comme :

sleep 999999999 | the-command

Ou pour éviter d'avoir à exécuter cette sleep supplémentaire commande, cela pourrait être fait avec un tube nommé :

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

Ici, en utilisant un descripteur de fichier intermédiaire pour contourner le fait que le shell se connecte stdin à /dev/null implicitement lorsque vous lancez une commande avec & (sauf si vous ajoutez une redirection stdin explicite comme notre <&3 ici).

Sous Linux (et probablement sous Linux uniquement), vous pouvez également faire :

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

/dev/fd/1 où fd 1 est connecté à un tube, sous Linux, se comporte comme un tube nommé. Autrement dit, lorsque vous l'ouvrez en mode lecture, vous obtenez l'extrémité de lecture du tuyau.

Ainsi ci-dessus, fd 0 sera connecté au bout lecture d'un tube dont l'autre bout est sur le fd 3 de the-command . Parce que the-command ne va rien écrire sur son fd 3, aucun read une tentative sur fd 0 bloquera (ou une lecture non bloquante renverra avec il n'y a rien à lire pour le moment , ou un select/poll renverra rien à lire soit comme the-command est probablement en train de faire s'il fait autre chose que d'attendre une entrée qui ne vient jamais).

Connexe :Comment obtenir l'auto-complétion de style bash dans zsh, (pour la commande git) ?
Linux
  1. Comment Linux gère-t-il plusieurs séparateurs de chemins consécutifs (/home////nom d'utilisateur///fichier) ?

  2. Quand utiliser /dev/random contre /dev/urandom ?

  3. Comment désactiver complètement un Cronjob vers /dev/null/?

  4. Que sont les fichiers /dev/zero et /dev/null sous Linux

  5. Comment encoder en base64 /dev/random ou /dev/urandom ?

Quelle est la portabilité de /dev/stdin, /dev/stdout et /dev/stderr ?

/dev/null sous Linux

screen Impossible d'ouvrir votre terminal '/dev/pts/0' - veuillez vérifier

l'utilisation de < /dev/null &dans la ligne de commande

noyau :désactiver /dev/kmem et /dev/mem

Créer un périphérique de bloc virtuel qui écrit dans /dev/null