Comment exécuter une commande à l'écran et se détacher?

75

Comment faire en sorte que screen exécute une commande puis se détache (c'est-à-dire automatiquement dans un seul script sans autre saisie qu'au-delà du démarrage initial du script)? Par exemple, je lance myscript.sh et il démarre automatiquement une session d'écran, exécute une commande, puis se détache.

darkfeline
la source

Réponses:

114

C'est facile:

screen -d -m yourcommand
Alan Curry
la source
4
pas de dé. Commande screen -d -m, screen -list dit pas de sockets, screen -r pas de sessions
darkfeline
1
D'une manière ou d'une autre, votre commande n'a pas été trouvée ou ne fonctionne pas correctement dans l'environnement d'écran créé automatiquement. Essayez de vous screen yourcommandpasser du -det -met voyez comment cela se passe en premier.
Alan Curry
Vous avez en quelque sorte raison. l'écran se termine lorsque la commande se termine, contrairement à mes attentes. Mais votre réponse fonctionne.
darkfeline
3
Vous pouvez changer cela en activant l' zombieoption dans l'écran. Mettez zombie xydans votre ~/.screenrc. Il devrait également être possible de l’activer pour une session seulement b en insérant zombie xyun autre fichier et en utilisant, -c filemais pour une raison quelconque, cela ne fonctionne pas lorsque j’essaie. Ou tout simplement utilisersh -c 'yourcommand;while :;do sleep 9999; done'
Alan Curry
@AlanCurry, non, cela ne fonctionne pas pour moi non plus, même si la commande s'exécute parfaitement (et prend plusieurs heures) lorsqu'elle est exécutée manuellement dans un écran.
Cerin
47

Pour exécuter une seule commande à l’écran et la détacher, vous pouvez essayer:

screen -dm sleep 10

Pour exécuter plusieurs commandes, essayez:

screen -dm bash -c "sleep 10; myscript.sh"

Veuillez noter que lorsqu'un programme se termine, screen (par défaut) tue la fenêtre qui le contenait.

Si vous ne voulez pas que votre session soit supprimée une fois le script terminé, ajoutez-le exec shà la fin, par exemple:

screen -dm bash -c 'sleep 5; exec sh'

Pour lister toutes vos sessions, essayez:

screen -list

Connexe: écran Démarrer Unix, commande Exécuter, détacher .

Kenorb
la source
2
Cela a fonctionné pour moi sur Ubuntu 16.04. En plus de nommer votre session afin que vous puissiez revenir plus tard, ajouter -S sessionname: screen -dmS MyLongRunningScript bash -c "...".
Dan Dascalescu
16

Afin de démarrer une nouvelle session en arrière-plan avec le nom 'sleepy'

screen -S sleepy -dm sleep 60

Pour tuer la session 'endormie'

screen -S sleepy -X quit      
Michal Zmuda
la source
pourquoi ça ne marche pas comme ça screen -S sleepy -dm "cd myfolder;sleep 60"?
Boîte à outils Le
@Toolkit Le problème est que la commande est entre guillemets et qu'elle a donc été traitée comme une seule commande volumineuse. De toute évidence, nous ne pouvons pas le prendre entre guillemets à cause du point-virgule. Pour résoudre ce problème, exécutez la commande comme suit: screen -S sleepy -dm bash -c "cd mon dossier; sommeil 60"
Jason Thompson
3
screen -dmS screen_session_name bash -c 'echo "doing stuff"; exec bash'
tkjef
la source
0

cela m’arrive quand j’appuie sur le contrôle c (sig int) pour quitter mon programme. il sort tout le chemin de tout bash. alors j'ai trouvé cela pour attraper SIGINT. et empêcher la sortie de la dernière bash. (besoin de taper exit pour sortir)

screen -dmS "screenNameHere" bash -c "trap 'echo gotsigint' INT; cd /mydir ; my_command_here;  bash"


example:

screen -dmS "status_updates" bash -c "trap 'echo gotsigint' INT; cd /opt/status_update ; forever index.js ;  bash"

Je trouve utile d’utiliser cron pour exécuter les programmes nodejs au démarrage. et d'exécuter l'écran au démarrage. dans cron il y a des événements spéciaux syntaxe @reboot event

to edit cron, execute:
crontab -e

then type
@reboot screen -dmS "screenNameHere" bash -c "trap 'echo gotsigint' INT; cd /mydir ; my_command_here;  bash"
Shimon Doodkin
la source