Je dois exécuter un programme java sur mes serveurs universitaires. Je me connecte à distance via leurs serveurs via ssh
J'ai donc utilisé nohup comme ceci:
nohup java -jar project.jar &
Cependant, lorsque je me déconnecte et ferme le terminal, puis me reconnecte au serveur, mon processus manque / est tué.
stdout
etstderr
vers certains fichiers - votre processus peut être tué par un signal autre que SIGHUP, lorsque vous essayez d'écrire sur un terminal ferméstdout
/stderr
. Par exemple, ajoutez>/dev/null 2>&1
à votre commande avant de&
signer le travail.nohup
- la plupart des implémentations le feront par défaut bien qu'il puisse être nécessaire de redirigerstdin
par exemple</dev/null
.Réponses:
nohup
Rendre le programme à l'abri du signalSIGHUP
et leSIGQUIT
signaler. Le shell moderne peut envoyer d'autres signaux lorsque vous vous déconnectez de votre session, il n'y a donc aucune garantie que votre programme n'est pas tué, même sousnohup
.La meilleure solution consiste à utiliser
tmux
ouscreen
, ou si vous utilisezbash
, vous pouvez essayer:la source
disown
, vous devez rediriger manuellement, par exemple ajouter</dev/null &>/dev/null
ssh localhost 'sleep 10m & disown'
.bash
ne sortira pas.ssh
que cela ne se termine pas s'il y a des programmes connectés au terminal. Cependant, ce qui précède est très bien si vous exécutez de manière interactive.nohup
ne rendent pas la commande à l'abriSIGQUIT
, mais seulement àSIGHUP
. Ce serait explicitement contraire à la norme et AFAIK ne peut se produire que sur (certaines versions de?) Solaris.Encore une autre option à la place du (dysfonctionnement chronique)
nohup
:Cela "démonifie" efficacement le processus. Il appartient maintenant à init, il ne sera donc jamais obtenu HUP, ses flux d'E / S sont sûrs et il a été bifurqué en arrière-plan.
Voir
man setsid
pour plus d'informations. Contrairement àscreen
ortmux
, ce n'est pas un programme qui revendique la propriété et continue de fonctionner. Il démarre simplement un programme dans son propre groupe de processus .la source
setsid
- être est-ce un peu plus idiot comme ça. Il saute une étape impliquée par nohup (avoir le processus re-parenté par init en tant qu'orphelin).nohup
serait plus flexible si vous souhaitez éventuellement mettre en avant le travail ultérieurement.Une autre idée serait d'utiliser la commande screen. Il est possible de démarrer un programme à l'écran, de le détacher et de se déconnecter. Ensuite, vous pouvez vous connecter et vous attacher à la session d'écran en cours.
Tutoriel: http://www.rackaid.com/blog/linux-screen-tutorial-and-how-to/
la source
Essayez d'exécuter votre nohup avec la redirection STDOUT et STDERR vers null:
la source
nohup.out
).nohup java -jar project.jar 2>/dev/null &
mais vous ne savez évidemment pas ce que vous faites. Encore mieux, nourrissez-vous aussistdin
/dev/null
.