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
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?nohup
empêche le processus de recevoir unSIGHUP
signal tandis que CTRL + C envoie unSIGINT
signal. C'est pourquoinohup
n'a pas l'effet escompté.Réponses:
J'avais raison de penser qu'il était
SIGINT
envoyé à tous les processus quand ctrl+ c, mais j'étais stupide en pensant que faire un autre processus le ferait sortir duprocess group
(voir mes tentatives dans leP.P.S.
).Ce n'est pas seulement le cas d'utilisation exact, mais la bonne solution.
En raison de la façon dont mon script était structuré, la réponse ne cadrait pas textuellement, c'est le script maintenant;
Le serveur continue de sortir dans le fichier journal après I ctrl+ cin
less
.Merci pour le temps de chacun.
la source
Avez-vous essayé de renier ?
ou quel que soit votre travail; disown est un shell intégré, sa page de manuel indique:
ÉDITER
Chose amusante, votre construction fonctionne sur mon Arch Linux:
Avant la commande ps , je devais faire défiler le fichier out.log, puis Ctrl+C, puis q.
la source
nohup
ligne dans une fonction quidisowns
elle-même, mais cela devrait être le même quenohup
. Je ne pense pas que ce soit unSIGHUP
problème, car lorsque je supprime laless
ligne, le script se termine avec le serveur toujours en cours d'exécution