Как проверить процесс наряду с его аргументами в списке процессов?

Хороший выбор! Вы могли бы хотеть прочитать документацию Debian относительно выбора. С веб-сайта Debian существует намного более категорическая информация, но выборка из документации суммирует его хорошо:

Если безопасность или устойчивость вообще важны для Вас: стабильная установка. период. Это - самый предпочтительный путь. Если Вы - новый пользователь, устанавливающий на настольной машине, запустите с конюшни. Часть программного обеспечения довольно стара, но это - наименее ошибочная среда для работы в. Можно легко переключиться на более современное нестабильное, после того как Вы немного более уверены. Если Вы - настольный пользователь с некоторым опытом в Linux, и не возражает стоять перед нечетной ошибкой время от времени, используйте нестабильный. Это имеет все последнее и самое большое программное обеспечение, и ошибки обычно исправляются быстро. Если Вы выполняете сервер, особенно тот, который имеет сильные требования устойчивости или выставляется Интернету, стабильная установка. Это - безусловно самый сильный и самый безопасный выбор.

Проблема с домашним разделом будет очень минимальна к, возможно, не существующему. UID/GID "старого" user/s мог бы измениться; но, это - простая фиксация: просто chown/chgrp к новому UID/GID.

Можно пойти от стабильного до тестирования к нестабильному, но не назад. Если устойчивые комплекты Вы и Ваши аппаратные средства, остановитесь там. В противном случае переключитесь на нестабильный. Ответвление тестирования иногда занимает долгое время (месяцы) для фиксации чего-либо, что повреждается.

4
25.12.2013, 08:34
4 ответа

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

$ pgrep -f Connection_Manager.sh

Пример

$ pgrep -f Connection_Manager.sh
16293

-f переключатель позволяет pgrep соответствовать всей командной строке и не только первой части.

Параметры командной строки

Для этого у Вас есть несколько методов. Вы могли попытаться анализировать их от вывода pgrep также. Необходимо будет добавить дополнительный переключатель, -a.

Пример

$ pgrep -af Conn
17306 /bin/bash ./Connection_Manager.sh arg1 arg2

Затем используйте awk, sed или что-то подобное для парсинга их вывода.

sed

$ pgrep -af ./Conn | sed 's/.*Connection_Manager.sh //'
arg1 arg2

awk

$ pgrep -af ./Conn | tr '\000' ' '| awk '{print $4, $5}'
arg1 arg2

Эти 2 метода первое, что пришло на ум, они могли несомненно быть оптимизированы.

Используя/proc/

Но в зависимости от количества аргументов и длины это могло вызвать, Вы выходите, если командная строка чрезмерно долга в длине. Таким образом, я, вероятно, пошел бы со вторым методом и проанализировал бы контент процесса cmdline файл. Каждый процесс имеет ряд файлов в рамках Linux' /proc файловая система, которая содержит метаинформацию о том процессе.

$ ls /proc/19146 
attr        cmdline          environ  limits     mountinfo   numa_maps      personality  stack    task
autogroup   comm             exe      loginuid   mounts      oom_adj        root         stat     timers
auxv        coredump_filter  fd       map_files  mountstats  oom_score      sched        statm    wchan
cgroup      cpuset           fdinfo   maps       net         oom_score_adj  sessionid    status
clear_refs  cwd              io       mem        ns          pagemap        smaps        syscall

Один из этих файлов является файлом cmdline. Но необходимо обратить особое внимание на содержание этого файла. Аргументы в этом файле разделяются символами NUL. Можно использовать cat -v <file> видеть их в окне терминала.

$ cat -v cmdline 
/bin/bash^@./Connection_Manager.sh^@arg1^@arg2^@

Это занимает место ^@ вместо NUL's.

Так парсинг содержания может быть сделан во множестве путей, один метод обсужден в ответе @Joesph, с помощью xargs -0 .... Другой использует cat -v.

Примеры

xargs

$ xargs -0 < cmdline 
/bin/bash ./Connection_Manager.sh arg1 arg2

кошка

$ cat -v cmdline 
/bin/bash^@./Connection_Manager.sh^@arg1^@arg2^@

Можно использовать sed к очистке этот 2-й метод немного.

$ cat -v cmdline | sed 's/\^@/ /g'

Ссылки

15
27.01.2020, 20:45
  • 1
    Большое спасибо за подробное и множество способов обработать несколько экземпляров. –  Ankit Vashistha 28.12.2013, 14:42

Если Вы находитесь в системе GNU/Linux с доступом к a proc файловая система, вот то, как я сделал бы это:

already_running=0
for pid in $(pgrep Connection_Manager.sh);do
   if xargs -0 </proc/$pid/cmdline | grep -q ... ;then # match arguments here
       already_running=1
       break
   fi
done
if ! [ $already_running -eq 1 ];then
    # run Connection_Manager.sh here
fi
2
27.01.2020, 20:45

Почему не просто на самом деле используют блокировку?

#!/bin/bash
if [[ -f /tmp/$0.lock ]]; then
    echo "$0 is locked."
    exit 1
else
    touch /tmp/$0.lock
    trap "rm -f /tmp/$0.lock" EXIT
fi
# The rest of the script
1
27.01.2020, 20:45
  • 1
    , я думал об использовании блокировки, но я хочу сделать это, не создавая временных файлов. Уже я использую некоторые временные файлы для сценария. –  Ankit Vashistha 25.12.2013, 08:51
  • 2
    Это небезопасно (любой мог выполнить процесс с именем соответствия), но можно избежать tempfiles с if pgrep $(basename $0) 2> /dev/null; then echo "Already running"; exit 1; fi –  DopeGhoti 25.12.2013, 09:25
  • 3
    Спасибо за ответ, после попытки различных путей, я наконец выбрал механизм блокировки. Я применяю блокировку, когда сценарий выполняется с некоторыми аргументами и дал название файла <arg1_arg2> блокировки, который я удаляю в конце сценария. Таким образом, я могу иметь несколько экземпляров сценария, работающего с различными аргументами, чем одно уже выполнение и блок несколько экземпляров сценария с теми же аргументами так, чтобы сценарий не был выполнен дважды с аргументами, уже используясь в выполнении instace, который был моим фактическим требованием. –  Ankit Vashistha 28.12.2013, 14:46

Я записал сценарий блокировки, который уже обрабатывает это, включая проблемы безопасности tempfile владения. Работы даже под busybox.

Текущая версия, доступная по http://dev.gentoo.org/~robbat2/scripts/pidlock

Это действительно проверяет аргументы нормально с помощью/proc / */cmdline и нормально обрабатывает устаревший lockfiles. Это используется для нескольких сотен cronjobs, рассеянных по *.gentoo.org.

Использование в качестве примера, показывающее его работа:

$ ( /usr/local/bin/pidlock  sleep 5 & ) ; sleep 0.1 ; /usr/local/bin/pidlock   sleep 5
Error! 'pidlock-sleep' is running already!

(Сон 0.1 там, чтобы иметь в первый один раз для запуска.)

1
27.01.2020, 20:45

Теги

Похожие вопросы