通过 su 获取屏幕上启动的进程的 PID

通过 su 获取屏幕上启动的进程的 PID

我有一个简单的脚本,可以在屏幕会话中以不同的用户身份启动 quassel-core!该脚本是:

#!/bin/sh
su ircc -c 'screen -dmS quassel /home/ircc/quassel/quassel-core'

我想使用 start-stop-daemon 在 debian init.d 脚本中启动和停止它。获取 quassel-core(或屏幕,也应该可行)的 PI​​D 并将其存储在文件中的最佳方法是什么?目前我使用:

pidof quassel-core > /var/run/quasselcore.pid

但如果其他用户启动 quassel-core,则将会失败。

答案1

看起来你只是乐意终止属于你的用户的名为 screen 的会话,而对 pid 并不真正感兴趣。在这种情况下,对于名为“ quassel”的 screen,你可以运行

screen -S quassel -X quit

根据手册将

关闭所有窗口并终止屏幕。

只有您拥有的屏幕会受到影响。

答案2

procps软件包中(或类似名称,取决于发行版),你可以找到pgrep

pgrep 查看当前正在运行的进程并将符合选择条件的进程 ID 列出到标准输出。

因此就你的情况而言:

pgrep -u josef quassel-core

quassel-core应该给你一个由用户启动的当前正在运行的进程的进程 ID 列表josef

在该包中,您还可以获得pkill基于类似搜索过程来终止进程的功能,因此如果您只打算使用它来做这些事情,那么您实际上并不需要 pid 文件。


综上所述:如果您使用start-stop-daemon,则可以使用--pidfile开关启动该过程。man start-stop-daemon有关用法,请参阅。

答案3

如果你想要屏幕上正在运行的进程的 PID,我回答说在 Stack Overflow 上的另一个问题中。以下是该答案的内容:

您可以在此处获取屏幕会话的 PID,如下所示:

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

假设您想要在foo_Monitor屏幕会话中运行 Bash 程序的 PID。使用屏幕会话的 PID,通过在 PPID(父 PID)中搜索已知 PID 来foo_Monitor获取在其中运行的会话的PID:bash

$ 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

现在仅获取会话的 PID bash

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

现在我们想要PID。只需嵌套命令,这次使用标志-vgrep bash获取进程不是重击:

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

只需将 1814 替换为屏幕会话的真实 PID:

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

答案4

这对你有用吗?

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

这假设只有一个这样的进程正在运行。如果不是这样,您需要进一步优化您的 grep。

相关内容