Exécutez un programme avec l'écran GNU et détachez-le immédiatement après

27

J'essaie de comprendre comment écrire un script qui démarrerait le (s) programme (s) dans les sessions d'écran GNU au démarrage du système. J'essaye ceci:

#!/bin/bash
screen -S test -d -m -X $HOME/folder/folder/.program \
screen -S test2 -d -m -X $HOME/folder/folder/.program2 \

mais la commande ne peut pas être exécutée car la session est déjà détachée? La seule chose dont j'ai besoin est d'exécuter la commande dans la session écran et de détacher cette session immédiatement.

Merci pour les réponses, mais maintenant j'ai rencontré un autre problème. Le script cesse de fonctionner après avoir mis des variables pour mon "programme et programme2". Quelque chose comme ça:

#!/bin/bash
screen -S test -d -m $HOME/folder/folder/.program -f config.cfg

pour une raison quelconque, "-f config.cfg" a été ignoré. Je suis également essayé de citer la commande et n'aide pas trop.

TbMa
la source
Pourquoi l' -Xoption?
enzotib

Réponses:

34

Vouliez-vous vraiment mettre le \à la fin de la ligne? Sinon, essayez de les supprimer - ils échappent au caractère suivant.

également, la suppression de l' -Xaide à la configuration fonctionne pour moi, par exemple:

screen -S test -d -m -X touch /tmp/test

échoue No screen session foundcependant:

screen -S test -d -m touch /tmp/test

fonctionne bien. En tant que tel, je soupçonne que ce qui suit fonctionnera pour vous:

#!/bin/bash
screen -S test -d -m $HOME/folder/folder/.program
screen -S test2 -d -m $HOME/folder/folder/.program2

N'oubliez pas que si vous l'exécutez au démarrage, $ HOME n'est pas le même qu'après vous être connecté en tant qu'utilisateur spécifique. Si vous devez l'exécuter en tant qu'un certain utilisateur, vous devrez utiliser les goûts de supour l'exécuter en tant qu'utilisateur, et spécifier le chemin complet supprimera toute ambiguïté:

#!/bin/bash
screen -S test -d -m su - username /home/username/folder/folder/.program
screen -S test2 -d -m su - username /home/username/folder/folder/.program2

Ou, vous appelleriez le script entier ci-dessus comme su - username /path/to/your/script.

Cry Havok
la source
Merci pour les réponses, mais maintenant j'ai rencontré un autre problème. Le script cesse de fonctionner après avoir mis des variables pour mon "programme et programme2"
TbMa
Ceci: fait screen -S test -d -m $HOME/folder/folder/.programpresque exactement ce que je recherche, sauf si le dossier / .program est terminé, la session d'écran est automatiquement fermée. Existe-t-il un moyen de maintenir la session d'écran (shell) en cours d'exécution même après la fin du programme? Peut-être qu'au lieu d'exécuter le programme exclusivement, démarrez un shell qui démarre le programme puis revient à l'invite du shell, ou quelque chose?
RocketNuts
4

Comme Cry Havok l'a mentionné, vous pouvez placer le programme directement sur la ligne de commande.

Si vous devez vraiment utiliser l'option -X, a) vous devez spécifier la commande 'screen' et b) la session doit exister au préalable.

screen -dmS test
screen -S test -X screen $HOME/folder/folder/.program
screen -dmS test2
screen -S test2 -X screen $HOME/folder/folder/.program2
Arcege
la source
Si vous placez le programme sur la ligne de commande, l'écran se ferme lorsque le programme se ferme; Je ne vois pas d'indicateur de ligne de commande pour garder l'écran ouvert si vous voulez voir la sortie de la console. Si vous démarrez l'écran et envoyez les commandes séparément, comme illustré ici, vous aurez peut-être besoin de sleepcommandes explicites pour donner à l'écran le temps de démarrer la session avant d'envoyer la commande.
Chinasaur
Cette réponse est très similaire à la réponse stackoverflow.com qui répond à une question similaire . Je préfère cette réponse plus que @CryHavok parce que cette réponse exécute votre programme dans le shell par défaut de votre utilisateur (@CryHavok exécute votre programme sans shell parent, donc lorsque le programme meurt ou si vous le ctrl-c, la session d'écran est terminée immédiatement)
Trevor Boyd Smith