7
votes

Comment puis-je continuer à exécuter un programme UNIX en arrière-plan même si je me déconnecte?

Je veux exécuter un script Perl avec un peu de temps (1) en boucle à l'arrière-plan sur une machine UNIX jusqu'à ce que je le tue.

Ceci est un ordinateur distant auquel je n'ai pas d'autorisations administratives (donc pour certains Raison, je ne peux pas utiliser Daemon :: générique :: tandis1), je me connecte à Ssh, et je veux qu'il continue à courir après que je me déconnecte.

Une façon dont j'ai découvert l'écriture quelque chose comme ça à bash: xxx

y a-t-il d'une autre autre, plus préférable de le faire?

La modification du crontab est interdite sur cet ordinateur (tandis que L'arrière-plan et les processus de longue durée ne sont pas).


0 commentaires

6 Réponses :


1
votes

Je pense que cela devrait fonctionner à partir de votre script Perl.

$SIG{ HUP } = 'IGNORE';


0 commentaires

0
votes

L'exécution du travail en arrière-plan à partir de la coquille est bien, en fonction de la quantité de travail manuelle que vous souhaitez mettre en veille à son fonctionnement continuellement.

J'utiliserais @reboot de Crontab (et éventuellement un bilan régulier aussi). Mais alors vous devez prendre en compte que le processus pourrait être lancé plusieurs fois. Le moyen le plus simple de gérer cela est d'avoir un fichier de verrouillage. Si le fichier est verrouillé, quittez, sinon continue à la tâche. N'oubliez pas d'utiliser des chèques non bloquants, sinon vous risquez de combiner des ressources système inutiles avec des processus morts.

L'écran est également une option s'il est disponible.

crontab + écran peut être combiné.


2 commentaires

Ensuite, vous ne pouvez pas vous assurer que le processus fonctionne continuellement (c'est-à-dire un redémarrage). L'écran et le NOHUP / PIPPAGE Le Sighup sont toujours des moyens de suivre.


Bord de conseil, demandez à l'administrateur avant de mettre des processus de référence sur cette machine. Si vous n'êtes pas autorisé à crontab, l'administrateur pourrait ne pas aimer vous le faire. Peut-être que vous serez autorisé si vous demandez bien :)



1
votes

Snippet est à Perldoc Perlipc:

use POSIX 'setsid';

sub daemonize {
    chdir '/'               or die "Can't chdir to /: $!";
    open STDIN, '/dev/null' or die "Can't read /dev/null: $!";
    open STDOUT, '>/dev/null'
                            or die "Can't write to /dev/null: $!";
    defined(my $pid = fork) or die "Can't fork: $!";
    exit if $pid;
    setsid                  or die "Can't start a new session: $!";
    open STDERR, '>&STDOUT' or die "Can't dup stdout: $!";
}


0 commentaires

1
votes
use Proc::Daemon;
Proc::Daemon::Init;
That's what I use for my Sendmail filter program and probably the easiest way to go. The module is available via CPAN.

7 commentaires

S'il ne peut pas utiliser Daemon :: générique :: tandis que1 parce qu'il ne peut pas l'obtenir installé, pourquoi procéderait :: Daemon fonctionnerait mieux? Est-ce dans la liste de module Core Perl - sinon, cela ne vous aidera pas beaucoup.


Je peux l'obtenir installé (j'ai modifié CPAN pour travailler sans mot de passe root), mais cela me dit quelque chose à propos de la capacité d'écrire dans / var / gérer


Hmm ... J'ai examiné la source et le module, lui-même, ne tente pas d'écrire sur / var / exécuté (au moins sur la version que j'utilise). C'est un joli petit module, vous voudrez peut-être simplement y jeter un coup d'œil et faire une version plus personnelle avec le code minimum dont vous avez besoin.


Oui, celui que j'utilise ne fait pas ça. Utilisez-vous du démon :: générique ou quelque chose de similaire aussi?


Je parlais de démon :: générique avec le / var / gun, pas proc :: démon. Je n'ai pas essayé celui-là.


Daemon :: Generic écrira un fichier PID, mais vous pouvez configurer où il l'écrit. cpan.org/modules/by-module/daemon/ Daemon-generic-0.61.Readme


John Cavan: Oh, je l'ai manqué!



6
votes

Vous devez fermer stdout, stardr, stdin, sinon vous êtes toujours lié à ce nombre spécifique TTY

./my_script.pl >/dev/null 2>&1 </dev/null &


1 commentaires

parfait! exactement ce dont vous avez besoin quand il n'y a pas d'écran



18
votes

Ma méthode préférée, et sans doute le plus facile, utilise écran : xxx


2 commentaires

Hah. J'ai déjà oublié que j'ai jamais posé cette question. L'écran est mon outil de choix maintenant, aussi :)


J'ai trouvé cet outil de sauvetage juste récemment. "Écran" vous permet de revenir dans la commande et de taper des choses. Cela fonctionne également parfaitement avec SSH.