Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

i have a simple script that starts quassel-core in a screen session as different user! The script is:

su ircc -c 'screen -dmS quassel /home/ircc/quassel/quassel-core'

I want to start and stop this in an debian init.d script using start-stop-daemon What is the best way to get the PID of quassel-core (or of the screen, that should work too) and store it in a file? At the moment i use:

pidof quassel-core > /var/run/

but that will fail if some other user starts quassel-core.

share|improve this question
pgrep -u ircc -f quassel-core – PsyKzz Jan 11 '15 at 0:25
up vote 3 down vote accepted

It seems like you are happy just to kill a named screen session belonging to your user, and not really interested in the pid. In that case, with a screen named "quassel", you can run

screen -S quassel -X quit

which as per the manual will

Kill all windows and terminate screen.

Only screens owned by you are affected.

share|improve this answer
Thanks, that works great! – Josef May 15 '12 at 7:22

In the procps package (or something similarly named, depending on distribution) you can find pgrep:

pgrep looks through the currently running processes and lists the process IDs which matches the selection criteria to stdout.

So in your case:

pgrep -u josef quassel-core

should give you a list of the process IDs belonging to currently running quassel-core processes started by the josef user.

In the package you also get pkill which kills a process based on a similar search process, so you wouldn't really need a pid file if this is all you are going to use it for.

All that said: if you use start-stop-daemon, you can use the --pidfile switch to start the process. See man start-stop-daemon for usage.

share|improve this answer
+1 This is a good way to go, similar method using ps: ps -U <user> | grep <process_name> | awk '{print $1}' – MaQleod May 14 '12 at 16:32
the --pidfile option doesn't work, because it will store the pid of the su process which will instantly exit after running screen! – Josef Jan 12 '15 at 10:22

After some more trying, here is my own solution:

screen -list | grep quassel | cut -f1 -d'.' | sed 's/\W//g'

It reads the pid of the screen with the name "quassel" Seems to be the safest way to me.

Thanks also to Daniel Andersson, this should work too.

start-stop-daemons --pidfile is of no use, because it doesn't create the pidfile! With -m it would store the pid of the screen started, but screen seems to fork itself on start, so the pid changes!

share|improve this answer
screen -list | awk '/quassel/{print substr($1,0,index($1,".")-1)}' is fewer forks and "nicer". But see separate answer if you just want to kill a named screen session. – Daniel Andersson May 15 '12 at 6:36

Would this work for you?

ps -ef | grep quassel-cor[e] | awk '{print $2}' > /var/run/

This assumes that there is only one such process running. If that is not true you need to further refine your grep.

share|improve this answer
Instead of grep you could use awk '/quassel-core/{print $2}' directly. ps` is not really meant to be used for processing like this, though; it is more of a presentation layer and can give unwanted results when trying to be processed (such as including the matching process itself among the matches). Better is to use a tool designed for searching through /proc in a more strict manner. In this case this is noticed since Josef wants to match on user name as well, and the matching soon gets tedious this way. – Daniel Andersson May 14 '12 at 16:25

If you want the PID of the process running in screen, I answered that in another question on this Stack Overflow. Here is the contents of that answer:

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
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}'

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}')

Just replace 1814 with the real PID or your screen session:

echo $(ps -el | grep $(ps -el | grep SCREEN_SESSION_PID | grep bash | awk '{print $4}') | grep -v bash | awk '{print $4}')
share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.