web-dev-qa-db-fra.com

SSH EXEC ne fonctionne pas pour exécuter le cmd de jar distant

Que s'est-il passé:
Je suis entré ssh root@ip Nohup Java -jar app.jar & pour exécuter un bocal sur mon serveur distant (le bocal est un serveur API).
Mon serveur local obtient les journaux de jar au lieu d'écrire dans Nohup sur le serveur distant et mon jar fonctionne mais ne fonctionne pas.

Résultat attendu:
Capable de SSH EXEC courir Nohup Java -jar app.jar & de mon système local.

Version:
Ubuntu 18.04

mise à jour:
L'URL d'API de jar renvoie la sortie uniquement lorsque jar cmd est exécuté via PuTTY.
Pour l'exécutable ssh distant, la sortie de l'URL de l'API de jar est 404

mise à jour 1:
Tout ce dont j'ai besoin est d'exécuter le bocal en arrière-plan sur mon serveur distant (exécutez la cmd depuis mon système local).

1
AATHITH RAJENDRAN

Sujet intéressant :)

J'ai d'abord pensé que vous devez utiliser des guillemets simples pour citer la commande à distance. Une bonne explication à ce sujet est fournie par @ pt314 dans la réponse acceptée à la question Comment SSH peut-il fonctionner avec une condition if? Voici la partie non essentielle:

Le problème principal est que les chaînes entre guillemets doubles sont développées par votre shell local ...

Mais ce n'est probablement qu'une partie du problème. Donc, avant de continuer, disons quelques mots sur la manière la plus canonique d'utiliser Nohup que nous pouvons trouver sur Internet:

Nohup comand -options arguments >/path/to/log 2>&1 &
|     |                         |             |    # run 'Nohup' in the background
|     |                         |             # redirect stderror to stdout
|     |                         # redirect stdout of 'Nohup', /dev/null when don't need it
|     # the command to be executed, its stdout/err will be appended to the nohop's stdout
# run the following command detached from the current Shell

D'après ce qui précède, il semble que vous ayez besoin d'une commande comme celle-ci:

ssh user@Host 'Nohup remote_command -optins arguments &' >/tmp/local.log

Mais que se passe-t-il réellement ici?

La sortie standard (sortie standard) de Nohup est attachée à la session ssh et la sortie de la commande ssh est redirigée vers un fichier, dans la session Shell actuelle. En d'autres termes, la commande distante est attachée à la session Shell locale. Donc, si nous tuons quelque chose sur la chaîne (la session ssh ou le shell local), tout échoue. Apparemment, dans ce cas, nous n'avons pas du tout besoin de Nohup sur la session distante.

Si nous allons plus loin, nous pouvons conclure que l'utilisation de Nohup du côté local est une bonne idée:

 Nohup ssh user@Host 'remote_command -optins arguments' >/tmp/local.log 2>&1 &

Cela semble beaucoup plus robuste, mais l'exécution de la commande à distance dépend toujours de la session ssh lancée à partir de l'ordinateur local, donc si, par exemple, elle est redémarrée, tout échouera à nouveau.


Je pense qu'il existe de nombreuses façons possibles de réaliser ce que vous voulez d'une manière plus sûre. Voici une suggestion.

1. Utilisons Nohup de la manière canonique pour exécuter la commande à distance:

ssh user@Host 'Nohup remote_command -optins arguments >/tmp/remote.log 2>&1 &' 

2. Récupérez le journal distant via ssh et écrivez un journal local en arrière-plan:

Nohup ssh user@Host 'tail -n+1 -F /tmp/remote.log' >/tmp/local.log 2>&1 &

3. Surveillez le fichier journal local en:

tail -F /tmp/local.log
0
pa4080