Как проверить существование процесса Linux

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Как проверить существование процесса Linux

Сообщение sezavasasilov » 28.02.2017 21:07:32

Добрый день, или вечер.

Как средствами fpc можно проверить существование процесса в Unix/Linux, зная его pid?

Либо выполнить стандартные shell/bash команды и получить вывод. Желательно, без создания дополнительных файлов.

Пока нашел только функции fpSystem, fpExecve, но они выводят в стандартный поток.
Может есть вариант перенаправить стандартный поток вывода во внутреннюю переменную?
sezavasasilov
незнакомец
 
Сообщения: 6
Зарегистрирован: 20.02.2017 21:27:06

Re: Как проверить существование процесса Linux

Сообщение pupsik » 28.02.2017 23:45:18

попробуйте...
Код: Выделить всё
function GetWindowCmd(PID: Cardinal): string;
var
  sl: TStringList;
begin
  Result := '';
  sl := TStringList.Create;
  try
    if FileExists('/proc/' + IntToStr(Pid) + '/cmdline') then
    begin
      sl.LoadFromFile('/proc/' + IntToStr(Pid) + '/cmdline');
      if sl.Count > 0 then
      begin
        sl.Text := StringReplace(sl.Text, #0, LineEnding, [rfReplaceAll]);
        Result := sl[0];
      end;
    end;
  finally
    sl.free;
  end;
end;


Или "курите" ман по иксам.
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Как проверить существование процесса Linux

Сообщение sezavasasilov » 28.02.2017 23:47:15

Придумал одно решение.
Проверяю существование папки с именем pid процесса:
Код: Выделить всё
uses
  BaseUnix;

//. . .

var
  s: string;
begin
  s := '1234'; // pid процесса

  if fpOpenDir('/proc/' + s) = nil then
    WriteLn('Процесса нет')
  else
    WriteLn('Процесс есть!');
end;


Добавлено спустя 2 минуты 31 секунду:
pupsi, одновременно запостили)

Спасибо за ответ
sezavasasilov
незнакомец
 
Сообщения: 6
Зарегистрирован: 20.02.2017 21:27:06

Re: Как проверить существование процесса Linux

Сообщение pupsik » 01.03.2017 00:36:05

Хм...
А что же делает:
Код: Выделить всё
if FpGetsid(ID) > - 1 then
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Как проверить существование процесса Linux

Сообщение olegy123 » 01.03.2017 14:00:45

через
sysctl можно получить список запущенных pid-ов
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: Как проверить существование процесса Linux

Сообщение sezavasasilov » 01.03.2017 18:46:01

pupsik
fpGetSid возвращает номер сессии процесса, что бы это ни значило
http://www.freepascal.org/docs-html/rtl ... etsid.html
sezavasasilov
незнакомец
 
Сообщения: 6
Зарегистрирован: 20.02.2017 21:27:06

Re: Как проверить существование процесса Linux

Сообщение pupsik » 01.03.2017 19:16:34

sezavasasilov т.е. если нет процесса он выдаст -1. Или я не прав?

п.с.
вики я и сам читать могу :)
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Как проверить существование процесса Linux

Сообщение Pavia » 01.03.2017 20:07:25

Аватара пользователя
Pavia
постоялец
 
Сообщения: 290
Зарегистрирован: 07.01.2011 12:46:51

Re: Как проверить существование процесса Linux

Сообщение pupsik » 01.03.2017 20:57:16

Pavia дело и не в доходчивости инфы :)
Каким образом можно достичь этого:
В случае ошибки, (pid_t) будет возвращено значение -1
?
У меня получилось только когда pid не верный. Т.е. нет процесса. В иных случаях он правильно "посылает" к "папе".
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Как проверить существование процесса Linux

Сообщение Pavia » 01.03.2017 21:04:18

FpGetsid(ID) - возвращает номер сессии.
Сессия - она же группа процессов связанная ... конвейером.
Номер группы есть номер процесса их лидера.
Когда ты запускаешь оконный терминал(он же командная строка в окошке) то ты создаёшь лидера сессии.
А когда посылаешь составную команду на исполнение к примеру:
find /var/log -name '*.log' | tar cv –files-from=- | bzip2 > log.tar.bz2 (*поиск в /var/log всех файлов, имена которых оканчиваются на '.log', и создание bzip-архива из них *)
То тут у тебя одна команда состоит из 3-х команд find, tar, bzip2
Терминал запустит каждую команду как отдельный процесс и свяжет эту группу в сеанс. Во-главе ... наверно с собой.
Так как таких терминалов у тебя может быть запущенно несколько и они могут работать параллельно, то для различения одновременно работающих цепочек и вводится понятие sid.

if FpGetsid(ID) > - 1 then

>-1 это просто проверку на ошибку. Обычно отрицательные коды считаются кодом ошибки положительные и 0 нормальными значениями.
Но не для данной функции тут кто-то на косячил, а признаться не захотел и теперь ошибку определяют по значению (pid_t) -1
Так что код "if FpGetsid(ID) > - 1 then" ещё и неправильный
Аватара пользователя
Pavia
постоялец
 
Сообщения: 290
Зарегистрирован: 07.01.2011 12:46:51

Re: Как проверить существование процесса Linux

Сообщение pupsik » 01.03.2017 21:11:06

ещё и неправильный
т.е. он не должен возвращать -1 при ненахождении процесса, а возвращает?
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Как проверить существование процесса Linux

Сообщение Лекс Айрин » 01.03.2017 21:32:32

Pavia писал(а):Но не для данной функции тут кто-то на косячил, а признаться не захотел и теперь ошибку определяют по значению (pid_t) -1
Так что код "if FpGetsid(ID) > - 1 then" ещё и неправильный


Насколько я знаю, такое бывает если случайно прочитать целое без знака, как целое со знаком... И вроде бы для С это вполне нормальная практика. Судя по всему, "правильное" значение 255.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Как проверить существование процесса Linux

Сообщение Pavia » 01.03.2017 21:34:14

Ещё раз ваша команда работает с ID-группы, а не процесса.
2.2.2.93 process ID: The unique identifier representing a process.
A process ID is a positive integer that can be contained in a pid_t. A process ID shall not be reused by the system until
the process lifetime ends. In addition, if there exists a process group whose process group ID is equal to that process
ID, the process ID shall not be reused by the system until the process group lifetime ends. A process that is not a
system process shall not have a process ID of 1

Процесса может не быть а группа процессов может существовать. К примеру если вы убьете главный поток.

Для проверки жизни процесса следует использовать
The sigqueue() function causes the signal specified by signo to be sent with the value specified by value to the
process specified by pid. If signo is zero (the null signal), error checking is performed but no signal is actually
sent. The null signal can be used to check the validity of pid.

The conditions required for a process to have permission to queue a signal to another process are the same as
for the kill() function.
The sigqueue() function shall return immediately. If SA_SIGINFO is set for signo and if the resources are
available to queue the signal, the signal shall be queued and sent to the receiving process. If SA_SIGINFO is
not set for signo, then signo shall be sent at least once to the receiving process; it is unspecified whether value
shall be sent to the receiving process as a result of this call.
Аватара пользователя
Pavia
постоялец
 
Сообщения: 290
Зарегистрирован: 07.01.2011 12:46:51

Re: Как проверить существование процесса Linux

Сообщение pupsik » 01.03.2017 22:28:01

Процесса может не быть а группа процессов может существовать.
в том то и дело что если задать не существующий id процесса... функция возвратит -1... В ином случае отдает" папу", т.е. >-1. Группа может существовать. И что? Если процесса нет то -1, есть - больше -1.
Каким образом функция может возвратить "папу" не существующего процесса????

К примеру если вы убьете главный поток
и что? Он поднимется по иерархии в верх. А если убить самую верхнюю "шапку" ... по идее система ляжет и тогда не до поиска процесса.
К сожалению:
тут кто-то на косячил, а признаться не захотел
считаю не верным суждением. Ошибки не вижу. Функция возвращает то что и описано.

п.с.
почитал я ваши ссылки... Из пустого... Это мне ясно и до ваших ссылок. Ответ не дан.
Другое дело - каким образом подтвердить что это необходимый процесс... Но этого в топике не требуется.

только заметил:
он же командная строка в окошке
улыбнуло.. Как ребёнку конфетку :)))))
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Как проверить существование процесса Linux

Сообщение olegy123 » 02.03.2017 03:00:55

так как сам интересуюсь.. посмотрел, что пишут
в итоге пришел к двум путям:
либо файлить /proc/{pid}

либо работать напрямую с ядром.
http://www.rldp.ru/ldp/lki24r/lki-2.htm

хотя можно поискать либлу, которая это уже реализует.

сам fpc работает с ядром только на уровне syscall (коды вызовов функций можно найти в oldlinux.pp)
https://filippo.io/linux-syscall-table/
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

След.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11

Рейтинг@Mail.ru