我有一个简单的脚本,可以在屏幕会话中以不同的用户身份启动 quassel-core!该脚本是:
#!/bin/sh
su ircc -c 'screen -dmS quassel /home/ircc/quassel/quassel-core'
我想使用 start-stop-daemon 在 debian init.d 脚本中启动和停止它。获取 quassel-core(或屏幕,也应该可行)的 PID 并将其存储在文件中的最佳方法是什么?目前我使用:
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。只需嵌套命令,这次使用标志-v
来grep 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。