Ctrl + c dans un sous-processus tue un processus sans précédent plus tôt dans le script

15

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 followutilise 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 lesscommande (pour arrêter tailing), cela tue en quelque sorte le serveur démarré nohupen 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 ^Cen less(A finale Received ^C signal, shutting downest é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 ^Gpour remplacer la commande d'interruption, mais ctrl+ a gfait exactement ce qu'il ^Cfaisait de toute façon (donc cela peut être un problème avec mon émulateur de terminal à la place; konsole)

  • placer le nohup& / ou la lessligne entre parenthèses (pour en faire un sous-shell)

  • exécuter le script au xtermlieu dekonsole

Hashbrown
la source
Quelqu'un a peut- être rencontré mon problème; 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?
Hashbrown
3
nohupempêche le processus de recevoir un SIGHUPsignal tandis que CTRL + C envoie un SIGINTsignal. C'est pourquoi nohupn'a pas l'effet escompté.
Piotr Dobrogost

Réponses:

11

J'avais raison de penser qu'il était SIGINTenvoyé à tous les processus quand ctrl+ c, mais j'étais stupide en pensant que faire un autre processus le ferait sortir du process group(voir mes tentatives dans le P.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;

#/bin/bash

setsid {SERVERCOMMAND} > currentOutput.log 2>&1 &
less +F currentOutput.log

Le serveur continue de sortir dans le fichier journal après I ctrl+ cin less.

Merci pour le temps de chacun.

Hashbrown
la source
0

Avez-vous essayé de renier ?

  disown -h %1

ou quel que soit votre travail; disown est un shell intégré, sa page de manuel indique:

renier

renoncer [-ar] [-h] [jobspec ...]

Sans options, chaque spécification de tâche est supprimée de la table des tâches actives. Si l' option -h' option is given, the job is not removed from the table, but is marked so that SIGHUP is not sent to the job if the shell receives a SIGHUP. If jobspec is not present, and neither the-a 'nor -r' option is supplied, the current job is used. If no jobspec is supplied, the-a' signifie supprimer ou marquer tous les travaux; l'option `-r 'sans argument jobspec limite l'opération aux travaux en cours d'exécution.

ÉDITER

Chose amusante, votre construction fonctionne sur mon Arch Linux:

 $ cat testm
  #!/bin/sh

  nohup /home/mario/temp/waste & 

  less +F out.log

 $ cat waste
  #!/bin/sh

  while [ 1 ]; do
    find / -print 2>1 1> out.log
  done
  $ ./testm
   nohup: appending output to nohup.out
  $ ps ax | grep waste
    19090 pts/2    S      0:00 /bin/sh /home/mario/temp/waste
    19124 pts/2    S+     0:00 grep waste]
  $

Avant la commande ps , je devais faire défiler le fichier out.log, puis Ctrl+C, puis q.

MariusMatutiae
la source
oui, mais je ne sais pas comment l'appliquer. J'ai essayé de placer la nohupligne dans une fonction qui disownselle-même, mais cela devrait être le même que nohup. Je ne pense pas que ce soit un SIGHUPproblème, car lorsque je supprime la lessligne, le script se termine avec le serveur toujours en cours d'exécution
Hashbrown
@Hashbrown pls voir mon montage
MariusMatutiae
Oui, j'ai aussi fait un test, avec un simple script bash appelé à la place de l'exécutable {SERVER}. Et rien n'a bien fonctionné. Voir mon commentaire sur la question. Je pense qu'il écoute délibérément d'une manière ou d'une autre. Puisqu'il s'agit d'un serveur propriétaire (et peu connu), je ne peux même pas dire ce que c'est pour que quelqu'un puisse dire "oh ça fait X, vous devez faire Y"
Hashbrown