Get PID of process started in screen by su
Solution 1
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.
Solution 2
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}')
Solution 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.
Solution 4
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!
Related videos on Youtube
Josef
If you came here wondering about my username, start your journey down the rabbit hole here and here! My preferred pronouns are: em/emacs/emacself. Make sure to get them right! Contributor, Curator, Life-long Student, Gender Activist, All purpose plastic wrapper, wireless doctor, Certified thinker, Alcohol evangelist, expert liar! To the extent possible under law, I waive all copyright and related or neighboring rights to all original source snippets written in any programming language I post on the StackExchange network. This does not include text which is not source code, even if a markup language is used to format this text. This does not include snippets I merely copied from questions/answers on the stack exchange network with minor changes! This work is published from: Austria.
Updated on September 18, 2022Comments
-
Josef over 1 year
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.
-
PsyKzz over 9 years
pgrep -u ircc -f quassel-core
-
-
MaQleod almost 12 years+1 This is a good way to go, similar method using ps: ps -U <user> | grep <process_name> | awk '{print $1}'
-
Daniel Andersson almost 12 years
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.