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).