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

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

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

  • Синтаксис замещения процесса
  • Как проверить, монтируется ли файловая система с помощью скрипта
  • Сценарий оболочки для исправления разрешенных прав доступа к файлу на большом количестве хостов
  • Bash: Назначение переменной не похоже на «stick»
  • Как сказать команде «cat» не висеть, когда нет пути?
  • перемещать файлы со специальными символами в новый каталог
  • Для скобок цикла - синтаксис типа C
  • Удаление файлов старше 500 дней
  • 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 
    Interesting Posts

    Отключить / изменить средний клик для вставки в X11 / Xorg

    S-Lang shell (slsh): вывод команды захвата в переменную

    Проблемы с psmouse sync!

    Создайте задания cron, чтобы повторять каждые X единиц времени, начиная с судовой единицы

    Преобразование / proc / cpuinfo в JSON в linux bash

    Cygwin, bash, изменить переменную окружающей среды?

    Самый простой способ отправить почту с вложением изображения из командной строки с помощью gmail?

    В меню KDE4 нет опции отключения или перезагрузки

    Имеет ли gsettings интерфейс GUI?

    почему эта замена шаблонов не работает над массивом?

    Как определить, какой дистрибутив Linux работает?

    Как я могу узнать, является ли относительная символьная ссылка внутренней для определенного поддерева или нет?

    правила аудита linux, исключая на основе типа msg exe, для команды su

    Как создать сценарий переключения вывода xrandr?

    Могу ли я указать, что пакет .deb зависит от Java, но не указывает, какую реализацию (например, OpenJDK, IcedTea, Oracle)?

    Linux и Unix - лучшая ОС в мире.