2

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.

1
  • pgrep -u ircc -f quassel-core
    – PsyKzz
    Jan 11, 2015 at 0:25

5 Answers 5

3

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.

0
3

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.

2
  • +1 This is a good way to go, similar method using ps: ps -U <user> | grep <process_name> | awk '{print $1}'
    – MaQleod
    May 14, 2012 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, 2015 at 10:22
3

If you want the PID of the process running in screen, I answered that in another question on 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 of your screen session:

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

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!

1
  • 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. May 15, 2012 at 6:36
0

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.

1
  • 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. May 14, 2012 at 16:25

You must log in to answer this question.

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