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

Я написал сценарий, где мне нужно передать несколько аргументов с тем же скриптом, скрипт выполняется через некоторое время с помощью cron. Чтобы убедиться, что нет нескольких экземпляров запущенных скриптов, я сделал чек, чтобы проверить, работает ли процесс скрипта с помощью ps -ef | grep -v grep | grep Connection_Manager.sh ps -ef | grep -v grep | grep Connection_Manager.sh

Я хочу проверить, какие аргументы используются в запущенном процессе скрипта, когда я выполняю проверку с использованием ps -ef . Как я могу проверить аргументы, которые используются в текущем процессе скрипта?

4 Solutions collect form web for “Как проверить процесс вместе с его аргументами в списке процессов?”

Что касается проверки того, что процесс уже запущен, я бы изменил то, что вы делаете, и вместо этого используйте 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 или что-то подобное, чтобы разобрать их вывод.

СЕПГ

 $ 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.

Таким образом, синтаксический анализ содержимого может быть выполнен различными способами, один метод обсуждается в ответе @ 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 для очистки этого второго метода.

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

Рекомендации

  • как получить аргументы командной строки, переданные в запущенный процесс в системах unix / linux?

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

 #!/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 

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

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

Он корректно проверяет аргументы, используя / proc / * / cmdline, и безопасно обрабатывает устаревшие блокирующие файлы. Он используется для нескольких сотен кроны, разбросанных по * .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 есть первый раз, чтобы начать.)

Если вы находитесь в системе GNU / Linux с доступом к файловой системе 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 
  • Соедините каждую строку файла с определенной переменной во второй команде
  • Удалите первые n строк из файла с переменной
  • Как использовать afl-fuzz (American Fuzzy Lop) с openssl
  • Проблемы при разметке eMMC с использованием sfdisk
  • Как получить возвращаемое значение из функции MATLAB
  • Различные результаты при использовании скрипта или кода вставки
  • bash если вопрос поведения инструкции
  • Получить переменную из строки
  • Невозможно конкатенировать пути к файлам, разрешено отклонение
  • Ошибка перенаправления Sub Shell с переменной (while ...) $ 3> $ testdir / $ testfile.log
  • не удается запустить скрипт php shell из symlink
  • Linux и Unix - лучшая ОС в мире.