Как проверить существование процесса Linux
Модератор: Модераторы
-
sezavasasilov
- незнакомец
- Сообщения: 6
- Зарегистрирован: 20.02.2017 20:27:06
Как проверить существование процесса Linux
Добрый день, или вечер.
Как средствами fpc можно проверить существование процесса в Unix/Linux, зная его pid?
Либо выполнить стандартные shell/bash команды и получить вывод. Желательно, без создания дополнительных файлов.
Пока нашел только функции fpSystem , fpExecve , но они выводят в стандартный поток.
Может есть вариант перенаправить стандартный поток вывода во внутреннюю переменную?
Как средствами fpc можно проверить существование процесса в Unix/Linux, зная его pid?
Либо выполнить стандартные shell/bash команды и получить вывод. Желательно, без создания дополнительных файлов.
Пока нашел только функции fpSystem , fpExecve , но они выводят в стандартный поток.
Может есть вариант перенаправить стандартный поток вывода во внутреннюю переменную?
попробуйте...
Или "курите" ман по иксам.
Код: Выделить всё
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;Или "курите" ман по иксам.
-
sezavasasilov
- незнакомец
- Сообщения: 6
- Зарегистрирован: 20.02.2017 20:27:06
Придумал одно решение.
Проверяю существование папки с именем pid процесса:
Добавлено спустя 2 минуты 31 секунду:
pupsi, одновременно запостили)
Спасибо за ответ
Проверяю существование папки с именем pid процесса:
Код: Выделить всё
uses
BaseUnix;
//. . .
var
s: string;
begin
s := '1234'; // pid процесса
if fpOpenDir('/proc/' + s) = nil then
WriteLn('Процесса нет')
else
WriteLn('Процесс есть!');
end;
Добавлено спустя 2 минуты 31 секунду:
pupsi, одновременно запостили)
Спасибо за ответ
через
sysctl можно получить список запущенных pid-ов
sysctl можно получить список запущенных pid-ов
-
sezavasasilov
- незнакомец
- Сообщения: 6
- Зарегистрирован: 20.02.2017 20:27:06
pupsik
fpGetSid возвращает номер сессии процесса, что бы это ни значило
http://www.freepascal.org/docs-html/rtl ... etsid.html
fpGetSid возвращает номер сессии процесса, что бы это ни значило
http://www.freepascal.org/docs-html/rtl ... etsid.html
sezavasasilov т.е. если нет процесса он выдаст -1. Или я не прав?
п.с.
вики я и сам читать могу
п.с.
вики я и сам читать могу
Pavia дело и не в доходчивости инфы
Каким образом можно достичь этого:
У меня получилось только когда pid не верный. Т.е. нет процесса. В иных случаях он правильно "посылает" к "папе".
Каким образом можно достичь этого:
?В случае ошибки, (pid_t) будет возвращено значение -1
У меня получилось только когда pid не верный. Т.е. нет процесса. В иных случаях он правильно "посылает" к "папе".
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" ещё и неправильный
Сессия - она же группа процессов связанная ... конвейером.
Номер группы есть номер процесса их лидера.
Когда ты запускаешь оконный терминал(он же командная строка в окошке) то ты создаёшь лидера сессии.
А когда посылаешь составную команду на исполнение к примеру:
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" ещё и неправильный
т.е. он не должен возвращать -1 при ненахождении процесса, а возвращает?ещё и неправильный
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
Pavia писал(а):Но не для данной функции тут кто-то на косячил, а признаться не захотел и теперь ошибку определяют по значению (pid_t) -1
Так что код "if FpGetsid(ID) > - 1 then" ещё и неправильный
Насколько я знаю, такое бывает если случайно прочитать целое без знака, как целое со знаком... И вроде бы для С это вполне нормальная практика. Судя по всему, "правильное" значение 255.
Ещё раз ваша команда работает с 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.
в том то и дело что если задать не существующий id процесса... функция возвратит -1... В ином случае отдает" папу", т.е. >-1. Группа может существовать. И что? Если процесса нет то -1, есть - больше -1.Процесса может не быть а группа процессов может существовать.
Каким образом функция может возвратить "папу" не существующего процесса????
и что? Он поднимется по иерархии в верх. А если убить самую верхнюю "шапку" ... по идее система ляжет и тогда не до поиска процесса.К примеру если вы убьете главный поток
К сожалению:
считаю не верным суждением. Ошибки не вижу. Функция возвращает то что и описано.тут кто-то на косячил, а признаться не захотел
п.с.
почитал я ваши ссылки... Из пустого... Это мне ясно и до ваших ссылок. Ответ не дан.
Другое дело - каким образом подтвердить что это необходимый процесс... Но этого в топике не требуется.
только заметил:
улыбнуло.. Как ребёнку конфеткуон же командная строка в окошке
так как сам интересуюсь.. посмотрел, что пишут
в итоге пришел к двум путям:
либо файлить /proc/{pid}
либо работать напрямую с ядром.
http://www.rldp.ru/ldp/lki24r/lki-2.htm
хотя можно поискать либлу, которая это уже реализует.
сам fpc работает с ядром только на уровне syscall (коды вызовов функций можно найти в oldlinux.pp)
https://filippo.io/linux-syscall-table/
в итоге пришел к двум путям:
либо файлить /proc/{pid}
либо работать напрямую с ядром.
http://www.rldp.ru/ldp/lki24r/lki-2.htm
хотя можно поискать либлу, которая это уже реализует.
сам fpc работает с ядром только на уровне syscall (коды вызовов функций можно найти в oldlinux.pp)
https://filippo.io/linux-syscall-table/
