Je ne savais pas si cela appartenait à SO (car il s'agit d'un bogue de codage) mais je pensais que vous seriez plus informés sur les subtilités du logiciel utilisé (donc peut-être même U&L pourrait être envisagé).
Voici le script de code minimal (voir les modifications pour le script complet, il y a une raison pour laquelle je le fais de cette façon);
#/bin/bash
nohup {SERVERCOMMAND} > currentOutput.log 2>&1 &
less +F currentOutput.log
Ce qu'il essaie de faire, c'est d'exécuter un serveur en arrière-plan, qui génère un fichier journal.
Ensuite, je follow
utilise ce fichier journal less +F
. Comme vous le faites, pour quitter cela, vous devez appuyer sur ctrl+ cavant de pouvoir frapper Q.
Ce qui se passe, c'est que lorsque je ctrl+ cdans la less
commande (pour arrêter tailing
), cela tue en quelque sorte le serveur démarré nohup
en haut! Rien d'autre n'est affecté. Je peux shift+ frecommencer à suivre le journal (qui n'obtient aucune nouvelle information puisque le serveur est tué) et si je frappe, Qle reste du script s'exécute normalement.
Savez-vous pourquoi cela se produit? Comment l'éviter / autre chose que je devrais utiliser?
PS
Le programme serveur peut écouter un ^C
, ce qui peut être le problème; est-ce que je peux faire quelque chose pour arrêter ça? Par exemple, lorsque je cours tout {SERVERCOMMAND}
seul (de manière bloquante), je peux frapper ctrl+ c, ce qui ne le tue pas immédiatement; il imprime Received ^C signal, shutting down
(puis se tue). C'est ce qui se passe quand je ^C
en less
(A finale Received ^C signal, shutting down
est écrit dans le journal).
PPS
J'ai essayé un certain nombre de choses (aucune n'a fonctionné);
essayer de déconnecter le stdin du script en changeant
nohup {SERVERCOMMAND} > currentOutput.log 2>&1 & to nohup echo '' | {SERVERCOMMAND} > currentOutput.log 2>&1 & or nohup cat /dev/null/ | {SERVERCOMMAND} > currentOutput.log 2>&1 &
en utilisant
stty intr ^G
pour remplacer la commande d'interruption, mais ctrl+ a gfait exactement ce qu'il^C
faisait de toute façon (donc cela peut être un problème avec mon émulateur de terminal à la place;konsole
)placer le
nohup
& / ou laless
ligne entre parenthèses (pour en faire un sous-shell)exécuter le script au
xterm
lieu dekonsole
nohup
empêche le processus de recevoir un SIGHUP
signal tandis que CTRL + C envoie un SIGINT
signal. C'est pourquoi nohup
n'a pas l'effet escompté.
I think it is due to the handling within the database software, not on the shell
. Comment un programme ferait-il cela? Comment, alors, pourrais-je l'arrêter?