Script Shell pour lancer le processus et l'empêcher de se terminer

0

Je cherche un script shell que je peux exécuter et qui exécutera un programme devant être exécuté pendant une durée infinie jusqu'à ce que je décide de le tuer.

Je suis déjà essayé nohup, écran, désavoué (dans Netcat / bin / sh Shell), mais ils ont tous échoué à faire le travail.

Le programme qui doit être exécuté a également besoin d’arguments.

EDIT: Les commentaires m'ont demandé de mentionner les problèmes avec les méthodes que j'ai essayées.

nohup: La fermeture de la fenêtre NetCat ferme également le processus

bg: Au début, NetCat indique: "Aucun contrôle de travail dans cette session"

désavoué: même résultat que nohup

écran: "Doit être connecté à un terminal"

John
la source
1
Exécuter un programme en screen, tmux ou nohup & amp; devrait tout travail. Vous avez déjà mentionné la plupart d'entre eux. Pourquoi cela n'a-t-il pas fonctionné? Quels problèmes avez-vous rencontrés?
Hennes
Ajout des problèmes avec les commandes utilisées.
John
Comment avez-vous essayé d'utiliser screen? Une fois dans une session d'écran, vous êtes dans un terminal. Si vous essayez d'exécuter la commande directement à partir de la ligne de commande, à savoir% screen myCommand, vous ne disposerez pas d'un terminal de contrôle. Il suffit de taper écran, exécutez votre commande après avoir reçu une nouvelle invite. Vous pouvez ensuite fermer la fenêtre et votre session d’écran continuera.
skarface
pastebin.com/9JKx0wd8 Cela semble être quelqu'un qui essaie de faire la même chose.
skarface

Réponses:

0

Remplacez "bash foo.sh" par tout ce dont vous avez besoin pour exécuter. ne survivra pas aux redémarrages.

perl -e "if(fork){exit}else{exec(\"bash foo.sh\")}"

modifier: Vous pouvez imprimer des fichiers $$ dans un fichier dans la zone else, avant l'exécutable si vous souhaitez capturer le pid. Vous pouvez aussi juste passer de la sortie du PS à grep pour tuer en fonction du pid.

skarface
la source
De l'OP: "a besoin de courir pendant une quantité infinie de temps jusqu'à ce que je décide de le tuer" - Vous ne savez pas si un redémarrage est inclus ici.
slhck
Ajoutez ensuite ce qui précède à vos scripts de démarrage. il y a très peu de choses qui survivront automatiquement à un redémarrage. nohup / screen / etc certainement pas.
skarface
J'en ai juste besoin pour fonctionner tant que le système est en place.
John
Oh, je pense que vous avez mal compris. Je pensais juste à la partie "comment s'y prendre pour le tuer".
slhck
Je pense que je devrais pouvoir le tuer en utilisant kill -9 PID
John
0

Tout d'abord, un script shell ne peut empêcher certains processus (d'arrière-plan) de se terminer si le système d'exploitation décide de le tuer ou si le processus se termine. Cela dit, voici une suggestion sur la façon de redémarrer un service. C'est brutal, mais simple.

Créez un fichier "sémaphore" et utilisez-le pour rompre une boucle permanente qui redémarre un travail.

#!/bin/sh

function run {
    local t=`mktemp  /tmp/service.XXX`
    touch $t
    while [ -f $t ]; do
        # restart a job here, e.g
        nc -l -p 4444 & pid=$!
        echo $pid > $t
        wait $pid
    done 
}

function stop {
    local pf=`ls /tmp/service.*| wc -l`
    if [ $pf -gt 1 ]; then
        echo why are there several pid files?

    elsif [ $pf -lt 1 ]; 
        echo nothing to stop

    else 
        pid=`cat /tmp/service.*`
        rm -f /tmp/service.*
        kill $pid
    fi
}

Source le fichier dans votre shell et exécutez les fonctions. Le script peut contenir des erreurs, mais l'idée devrait être utilisable.

Ярослав Рахматуллин
la source
Je pense que le PO demande quelque chose qui continuera à fonctionner même après la fin de la session de contrôle. Ce qui précède rendra quelque chose de résilient au fait d'être tué, mais cela n'empêchera pas un processus de mourir lorsque la session de contrôle s'en va. Vous devez bifurquer quelque part.
skarface
Tu as raison. J'ai oublié de mentionner que cela devrait fonctionner dans un écran.
Ярослав Рахматуллин