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

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

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

  • как создать скрипт для резервного копирования баз данных MySQL на отдельные файлы?
  • Прикрепить файлы для отправки почты, которые являются результатом набора команды find
  • Поймите, почему сценарий bash не выполняет основной?
  • Выполнить ./script.sh vs bash script.sh - отклонено разрешение
  • Как читать пользовательский ввод строки за строкой до Ctrl + D и включать строку, в которой набирается Ctrl + D
  • Загрузка нескольких файлов через ftp с помощью curl
  • Возврат значения из функции bash
  • Использование аргументов команды sed для совместимости с GNU и BSD Unix (редактирование на месте)
  • 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 
    Linux и Unix - лучшая ОС в мире.