Super User is a question and answer site for computer enthusiasts and power users. Join them; it only takes a minute:

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:

#!/bin/sh
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/quasselcore.pid

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
1  
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/quasselcore.pid

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

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

You must log in to answer this question.

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