Exécuter le script dans un écran


25

Je veux exécuter un script bash dans un écran détaché. Le script appelle un programme plusieurs fois, chacun prenant trop de temps à attendre. Ma première pensée a été d'ouvrir simplement un écran, puis d'appeler le script, mais il semble que je ne puisse pas me détacher (par ctrl-a d) pendant l'exécution du script. J'ai donc fait quelques recherches et trouvé cette instruction pour remplacer le shebang par ce qui suit:

#!/usr/bin/screen -d -m -S screenName /bin/bash

Mais cela ne fonctionne pas non plus (les options ne sont pas reconnues). Aucune suggestion?

PS: Il me vient à l'esprit que screen -dmS name ./script.shcela fonctionnerait probablement pour mes besoins, mais je suis toujours curieux de savoir comment intégrer cela dans le script. Merci.

Réponses:


28

La ligne de shebang que vous avez vue peut fonctionner sur certaines variantes Unix, mais pas sur Linux. Les lignes de shebang de Linux sont limitées: vous ne pouvez avoir qu'une seule option. La chaîne entière -d -m -S screenName /bin/bashest passée en tant qu'option unique à screen, au lieu d'être passée en tant que mots différents.

Si vous voulez exécuter un script à l'intérieur de l'écran et ne pas jouer avec plusieurs fichiers ou citer, vous pouvez faire du script un script shell qui appelle l'écran s'il n'est pas déjà à l'intérieur de l'écran.

#!/bin/sh
if [ -z "$STY" ]; then exec screen -dm -S screenName /bin/bash "$0"; fi
do_stuff
more_stuff

Ça marche bien, à quoi "$0"ça sert ici?
Fabich

4
@Lordofdark C'est le nom du script. Le script invoque screenqui invoque /bin/bashqui invoque à nouveau le script.
Gilles 'SO- arrête d'être méchant'

16

Selon les pages de manuel de l'écran:

  • screen -d -m Écran de démarrage en mode détaché. Cela crée une nouvelle session mais ne s'y attache pas. Ceci est utile pour les scripts de démarrage du système.
  • -S sessionname Définissez le nom de la nouvelle session sur sessionname.

Donc, quand j'ai exécuté la commande que vous avez fournie: screen -dmS name ./script.sh

L'écran démarre une fenêtre appelée nom et exécute automatiquement ce script.sh. Pour y revenir pour voir le statut, il vous suffit de taper:screen -r test

Maintenant avec Ubuntu 14.04, les commandes sont légèrement différentes. Essayer:

screen -d -m -S test

Maintenant, pour exécuter le script, vous devrez aller dans leur fichier de configuration pour le faire:

sudo vim /etc/screenrc

Une fois là-bas, faites défiler vers le bas et vous verrez:

# Example of automatically running some programs in windows on screen startup.
#
#   The following will open top in the first window, an ssh session to monkey
#   in the next window, and then open mutt and tail in windows 8 and 9
#   respectively.
#
# screen top
# screen -t monkey ssh monkey
# screen -t mail 8 mutt
# screen -t daemon 9 tail -f /var/log/daemon.log

C'est la section où vous devrez ajouter le nom du script à exécuter et qui devrait vous permettre de faire tout ce dont vous avez besoin à partir de l'écran.


D'une certaine manière, cette commande ( screen -dmS ...) ne fonctionne pas pour moi, même si elle le devrait vraiment. Je l'exécute et puis screen -lset aucune prise n'est trouvée. Pensées?
bongbang

Quelle distro utilisez-vous?
ryekayo

NAME = "Ubuntu" VERSION = "14.04.1 LTS, Trusty Tahr" Je pense. C'est une machine virtuelle.
bongbang

Donne-moi un peu parce que je viens de quitter le travail et que j'essaie mal d'utiliser l'écran sur ma machine qui est également Ubuntu 14.04
ryekayo

@bongbang - quelle version d'écran avez-vous?
slm

3

C'est un peu vieux mais l'un des rares fils que j'ai pu trouver pour le faire. Après avoir joué, le seul moyen de le faire fonctionner en mode détaché avec ubuntu 14. est

screen -d -m -t nameofwindow sh nameoflaunch.sh

Le lancement serait la deuxième partie ci-dessus qui héberge les commandes java actuelles et la version du serveur. Je lance de la vanille.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.