15

I often leave tasks running within screen so that I can check on them later, but I sometimes need to check which command is running within the screen. It's usually a php script of sorts, such as

screen -d -m nice -n -10 php -f convertThread.php start=10000

I don't record which screens are running which command, but I'd like to be able to get a feel for the progress made by checking what command was run within it, without killing the process.

I don't see any option for this within the screen help pages.

2 Answers 2

25

I recently had to do this. On Stack Overflow I answered how to find the PID of the process running in screen. Once you have the PID you can use ps to get the command. Here is the contents of that answer with some additional content to address your situation:

You can get the PID of the screen sessions here like so:

$ screen -ls
There are screens on:
        1934.foo_Server         (01/25/15 15:26:01)     (Detached)
        1876.foo_Webserver      (01/25/15 15:25:37)     (Detached)
        1814.foo_Monitor        (01/25/15 15:25:13)     (Detached)
3 Sockets in /var/run/screen/S-ubuntu.

Let us suppose that you want the PID of the program running in Bash in the foo_Monitor screen session. Use the PID of the foo_Monitor screen session to get the PID of the bash session running in it by searching PPIDs (Parent PID) for the known PID:

$ ps -el | grep 1814 | grep bash
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S  1000  1815  1814  0  80   0 -  5520 wait   pts/1    00:00:00 bash

Now get just the PID of the bash session:

$ ps -el | grep 1814 | grep bash | awk '{print $4}'
1815

Now we want the process with that PID. Just nest the commands, and this time use the -v flag on grep bash to get the process that is not bash:

$ echo $(ps -el | grep $(ps -el | grep 1814 | grep bash | awk '{print $4}') | grep -v bash | awk '{print $4}')
23869

We can use that PID to find the command (Look at the end of the second line):

$ ps u -p 23869
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
dotanco+ 18345 12.1 20.1 5258484 3307860 ?     Sl   Feb02 1147:09 /usr/lib/foo

Put it all together:

$ ps u -p $(ps -el | grep $(ps -el | grep SCREEN_SESSION_PID | grep bash | awk '{print $4}') | grep -v bash | awk '{print $4}')
1
  • Oh, clever! I like it! Since this answers the question directly, I'm going to accept this answer. I appreciate it! Sorry @Ghanima (:' Feb 9, 2015 at 20:04
7

What about using screen -S <your-fancy-name> to give the screen sessions meaningful names according to the commands they run? Names will be listed with screen -ls and be used to resume a session by screen -r <your-fancy-name>.

Edit to add:

Since it has been brought to my attention just the other day. tmux offers quite the same set of functionality as screen (if not even more) and comes with a feature fitting your needs. From the FAQ: "tmux supports automatically renaming windows to the running application without gross hacks using escape sequences. Its even on by default."

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .