How can I get screen to execute a command and then detach (That is, automatically in a single script without further input beyond initially starting the script)? e.g. I run myscript.sh and it automatically starts a screen session, executes a command, then detaches.
8 Answers
This is an easy one:
screen -d -m yourcommand From the Screen User's Manual:
-d -m
Start screen in detached mode. This creates a new session but doesn’t attach to it. This is useful for system startup scripts.
- 12no dice. screen -d -m command, screen -list says no sockets, screen -r no sessionsdarkfeline– darkfeline2012-07-29 02:24:58 +00:00Commented Jul 29, 2012 at 2:24
- 1Somehow your command wasn't found, or isn't working correctly in the automatically-created screen environment. Try just doing
screen yourcommandwithout the-dand-mand see how that goes first.Alan Curry– Alan Curry2012-07-29 02:28:01 +00:00Commented Jul 29, 2012 at 2:28 - 2You're sort of right. screen terminates when the command finishes, contrary to my expectations. But your answer does work.darkfeline– darkfeline2012-07-29 02:34:32 +00:00Commented Jul 29, 2012 at 2:34
- 6You can change that by enabling the
zombieoption in screen. Putzombie xyin your~/.screenrc. It should also be possible to enable it for one session only b puttingzombie xyin another file and using-c filebut for some reason that's not working when I try it. Or just usesh -c 'yourcommand;while :;do sleep 9999; done'Alan Curry– Alan Curry2012-07-29 02:39:15 +00:00Commented Jul 29, 2012 at 2:39 - 1@AlanCurry, Nope, this doesn't work for me either, even though the command runs perfectly (and takes several hours) when run in a screen manually.Cerin– Cerin2014-09-27 03:08:50 +00:00Commented Sep 27, 2014 at 3:08
To run a single command in screen and detach, you may try:
screen -dm sleep 10 To run multiple commands, try:
screen -dm bash -c "sleep 10; myscript.sh" Please note that when a program terminates, screen (per default) kills the window that contained it.
If you don't want your session to get killed after script is finished, add exec sh at the end, e.g.:
screen -dm bash -c 'sleep 5; exec sh' To list all your sessions, try:
screen -list Related: Start Unix screen, Run command, Detach.
- 9This worked for me on Ubuntu 16.04. In addition to name your session so you can return to it later, add
-S sessionname:screen -dmS MyLongRunningScript bash -c "...".Dan Dascalescu– Dan Dascalescu2017-05-26 21:33:51 +00:00Commented May 26, 2017 at 21:33 - Is there a way to replace
5inscreen -dm bash -c 'sleep 5; exec sh'by a variable?Radio Controlled– Radio Controlled2020-01-08 08:43:29 +00:00Commented Jan 8, 2020 at 8:43 - 1@RadioControlled
time=5; screen -m bash -c "sleep $time; exec sh"kenorb– kenorb2020-01-08 10:21:23 +00:00Commented Jan 8, 2020 at 10:21 - @kenorb, the problem is that it only worked with single quotes. Let's say:
'for k in `seq $i $j`; do echo $k; done', where $i and $j are from the parent script.Radio Controlled– Radio Controlled2020-01-08 12:37:40 +00:00Commented Jan 8, 2020 at 12:37 - This is a robust answer. I needed
bash -c. I can only assume that when I calledscreen -dm head foo > barit wrotescreen -dm head footobar.screen -dm bash -c "head foo > bar"fixed that.DryLabRebel– DryLabRebel2023-04-03 06:18:23 +00:00Commented Apr 3, 2023 at 6:18
In order to start new session in background with name 'sleepy'
screen -S sleepy -dm sleep 60 In order to kill 'sleepy' session
screen -S sleepy -X quit - why doesn't it work like
screen -S sleepy -dm "cd myfolder;sleep 60"?Toolkit– Toolkit2017-12-28 09:22:16 +00:00Commented Dec 28, 2017 at 9:22 - 1@Toolkit The issue is that you have the command in quotes and so it was treated as one large command. Obviously we can't take it out of quotes because of the semicolon. To solve this, execute the command like so: screen -S sleepy -dm bash -c "cd myfolder;sleep 60"Jason Thompson– Jason Thompson2019-03-01 15:51:56 +00:00Commented Mar 1, 2019 at 15:51
it happen to me when I pressed control c (sig int) to exit my program. it exits all the way from all bash. so I found this to catch SIGINT. and prevent exit from last bash. (need to type exit to exit)
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" I find it useful to use cron to run nodejs programs on startup. and to run the screen at boot time. in cron there are special events syntax @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" - 1exactly what was looking for -- had same issue where shell would exit -- thanks! P.S. and screen -r SessionName -x {quit, kill} can be used later if neededDotDotJames– DotDotJames2020-04-12 20:00:28 +00:00Commented Apr 12, 2020 at 20:00
Here are the steps you can follow to run a process in screen, detach from the terminal, and then reattach.
From the command prompt, just run
screen. This will give you a new subshell.Run your desired program
Detatch from the screen session using the key sequence
Ctrl-a Ctrl-d(note that allscreenkey bindings start withCtrl-a). This will drop you back to your original shell and display a message "[detached]", indicating that the screen session is still running.You can then list the available screen sessions by running
screen -listYou can reattach to this screen session by running
screen -r. Once reattached, you will be able to take off where you left off and see any output that was printed to the screen during the time that you were detached. If you have multiple screen sessions, then you can specify the tty name (as displayed byscreen -list) as an argument toscreen -rto attach to a particular session.
Buliding on some of the ideas in other answers here, and on https://serverfault.com/questions/368054/run-an-interactive-bash-subshell-with-initial-commands-without-returning-to-the my soloution was.
screen -dm bash -c 'bash --init-file <(echo command)' replacing command with the command to execute.
This is the closest equivilent I can think of to manually starting a screen session and then running a command inside it.
ctrl+c works as it normally would in an interactive session to kill the program and return to a shell inside screen. Unfortunately ctrl+z doesn't seem to work.
I hope this may help for screen issues: https://askubuntu.com/questions/124897/how-do-i-detach-a-screen-session-from-a-terminal/1429444#1429444
- Your answer could be improved with additional supporting information. Please edit to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers in the help center.2022-09-15 07:16:19 +00:00Commented Sep 15, 2022 at 7:16
- While this link may answer the question, it is better to include the essential parts of the answer here and provide the link for reference. Link-only answers can become invalid if the linked page changes. - From ReviewDarkDiamond– DarkDiamond2022-09-15 07:50:13 +00:00Commented Sep 15, 2022 at 7:50
- Thank you for pointing out that I have shared the wrong link earlier.Brijesh Sondarva– Brijesh Sondarva2022-10-31 10:24:44 +00:00Commented Oct 31, 2022 at 10:24
sleeporexeccommand in answers below, to force screen to not terminate.