1

у меня есть простой сценарий, который запускает квазелоро в сеансе экрана от имени другого пользователя! Сценарий:

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

Я хочу запустить и остановить это в сценарии debian init.d, используя start-stop-daemon. Каков наилучший способ получить PID квази-ядра (или экрана, который тоже должен работать) и сохранить его в файле ? На данный момент я использую:

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

но это не удастся, если какой-то другой пользователь запустит квазелдер.

5 ответов5

3

В пакете procps (или что-то похожее в зависимости от дистрибутива) вы можете найти pgrep:

pgrep просматривает запущенные в данный момент процессы и перечисляет идентификаторы процессов, которые соответствуют критериям выбора для stdout.

Итак, в вашем случае:

pgrep -u josef quassel-core

должен дать вам список идентификаторов процессов , входящих в настоящее время работает quassel-core процессы , запущенные пользователем josef

В пакете вы также получаете pkill который убивает процесс, основанный на аналогичном процессе поиска, поэтому вам не понадобится pid-файл, если это все, для чего вы собираетесь его использовать.


Все это говорит: если вы используете start-stop-daemon , вы можете использовать ключ --pidfile чтобы запустить процесс. Смотрите man start-stop-daemon для использования.

3

Кажется, что вы счастливы просто убить именованный сеанс экрана, принадлежащий вашему пользователю, и не очень заинтересованы в pid. В этом случае, с экраном с именем « quassel », вы можете запустить

screen -S quassel -X quit

который в соответствии с руководством будет

Убить все окна и закрыть экран.

Это касается только тех экранов, которые принадлежат вам.

1

После еще нескольких попыток вот мое собственное решение:

screen -list | grep quassel | cut -f1 -d'.' | sed 's/\W//g'

Это читает pid экрана с именем "квазель". Кажется, это самый безопасный способ для меня.

Спасибо также Даниэлю Андерссону, это должно сработать.

start-stop-daemons --pidfile бесполезен, потому что он не создает pidfile! С -m он сохранит запущенный pid экрана, но экран, кажется, самопроизвольно запускается, поэтому pid меняется!

0

Будет ли это работать для вас?

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

Это предполагает, что работает только один такой процесс. Если это не так, вам нужно еще больше уточнить ваш grep.

0

Если вы хотите, чтобы PID процесса выполнялся на экране, я ответил на этот вопрос другим вопросом об этом переполнении стека. Вот содержание этого ответа:

Вы можете получить 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.

Предположим, вам нужен PID программы, запущенной в Bash, в сеансе экрана foo_Monitor . Используйте PID сеанса экрана foo_Monitor чтобы получить PID сеанса bash запущенного в нем, путем поиска PPID (Parent PID) для известного 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

Теперь получите только PID сеанса bash :

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

Теперь мы хотим, чтобы процесс с этим PID. Просто вложите команды, и на этот раз используйте флаг -v на grep bash чтобы получить процесс, который не является 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}')

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .