Squeak.ru - шаблоны программирования

Поиск команды для определенного PID в Linux из Python

Я хотел бы знать, можно ли узнать «команду», для которой установлен PID. Когда я говорю «команда», я имею в виду то, что вы видите в последнем столбце, когда запускаете команду «top» в оболочке Linux. Я хотел бы как-нибудь получить эту информацию от Python, когда у меня есть конкретный PID.

Любая помощь была бы замечательной. Спасибо.

17.09.2009

Ответы:


1

ПОЖАЛУЙСТА, не используйте /proc файловую систему в производственном коде. Вместо этого используйте четко определенные интерфейсы POSIX, такие как вызовы glibc и стандартные команды оболочки! Сделайте мир Linux более стандартизированным, это действительно необходимо!

То, что вам нужно, хорошо достигается путем вызова команды оболочки

ps -p <YOUR PID> -o cmd h

Никакого парсинга не требуется!

Не говоря уже о том, что чтение вывода команды оболочки из python требует не больше усилий, чем чтение из файла в /proc. И это также делает вашу программу более переносимой!

17.09.2009
  • В некотором роде правда, но вопрос был о Linux, поэтому мы ответили на настоящий вопрос, и я думаю, что большинство из нас сделало предположение, что он знает о ps(1). 18.09.2009
  • @DigitalRoss: тогда вопрос будет звучать так: откуда ps берет информацию из командной строки? 18.09.2009
  • Слишком уж претенциозно для меня. 18.09.2009
  • ps работает путем чтения виртуальных файлов в / proc. Так обстоит дело с четко определенным интерфейсом POSIX (который вообще был?). 18.09.2009
  • Послушайте, я бы отметил вас обоих как правильные ответы, но не смог. Мне показалось, что ответ Павла больше того, что я искал, но ответ, данный для DigitalRoss, тоже был отличным. Проголосует за оба. 18.09.2009
  • @Nick Stinemates, @Michael Foukarakis. Привет, я знаю, как работает ps (да, он действительно читает файлы в /proc). Но когда вместо /proc изобретут /foobar систему, вам придется переписывать свою программу. В любом случае, возможно, мне повредили мозг из-за работы в рабочей группе LSB, но вам действительно следует придерживаться стандартов, когда этого достаточно для вас - а это тот случай, который мы рассматриваем. 18.09.2009
  • Эта команда выведет аргументы командной строки, но разделит их пробелами. Если вы пытаетесь разбить аргументы обратно на список строк, вы не сможете различать аргументы и аргументы с пробелами. (Что вы можете сделать с /proc/$PID/cmdline) 03.10.2012

  • 2

    Посмотрите в /proc/$PID/cmdline

    17.09.2009

    3

    Прочтите команду ps и проанализируйте ее вывод.

    ps -p [PID] -o cmd 
    

    должен сделать это

    17.09.2009

    4

    Посмотрите /proc/$PID/cmdline, а затем os.readlink () на /proc/$PID/exe.

    /proc/$PID/cmdline не обязательно будет правильным, поскольку программа может изменить свой вектор аргументов или он может не содержать полный путь. Три примера этого из моего текущего списка процессов:

    • avahi-daemon: chroot helper
    • qmgr -l -t fifo -u
    • /usr/sbin/postgrey --pidfile=/var/run/postgrey.pid --daemonize --inet=127.0.0.1:60000 --delay=55

    Первый очевиден - это недопустимый путь или имя программы. Второй - это просто исполняемый файл без имени пути. Третий выглядит нормально, но на самом деле вся командная строка находится в argv[0] с пробелами, разделяющими аргументы. Обычно у вас должны быть аргументы, разделенные NUL.

    Все это показывает, что /proc/$PID/cmdline (или вывод ps (1)) ненадежен.

    Однако и /proc/$PID/exe тоже. Обычно это символическая ссылка на исполняемый файл, который является основным текстовым сегментом процесса. Но иногда после него стоит «(deleted)», если исполняемый файл больше не находится в файловой системе.

    Кроме того, программа, представляющая собой текстовый сегмент, не всегда то, что вам нужно. Например, /proc/$PID/exe из этого /usr/sbin/postgrey примера выше - это /usr/bin/perl. Так будет со всеми интерпретируемыми скриптами (#!).

    Я остановился на синтаксическом анализе /proc/$PID/cmdline - взятии первого элемента вектора, а затем поиске пробелов в нем и взятии всего до первого пробела. Если это был исполняемый файл - я остановился на этом. В противном случае я сделал ссылку для чтения (2) на /proc/$PID/exe и удалил все строки «(deleted)» на конце. Эта первая часть завершится ошибкой, если в имени исполняемого файла действительно есть пробелы. С этим ничего не поделаешь.

    КСТАТИ. Аргумент использования ps (1) вместо /proc/$PID/cmdline в этом случае неприменим, так как вы собираетесь вернуться к /proc/$PID/exe. Вы будете зависеть от файловой системы /proc, поэтому вы также можете читать ее с помощью read (2) вместо pipe (2), fork (2), execve (2), readdir (3) ..., write (2) прочтите (2). Хотя ps и /proc/$PID/cmdline могут быть одинаковыми с точки зрения строк кода Python, за кулисами с ps происходит гораздо больше.

    18.09.2009
  • Отличное описание. Спасибо за это, camh. 18.09.2009

  • 5

    Интересным пакетом Python является psutil.

    Например, чтобы получить команду для определенного PID:

    import psutil
    pid = 1234 # The pid whose info you're looking for
    p = psutil.Process(pid)
    print p.cmdline
    

    В последней строке будет напечатано что-то вроде ['/usr/bin/python', 'main.py'] .

    Более надежный способ получить эту информацию, будьте осторожны, если pid представляет процесс, который больше не выполняется:

    import psutil
    pid = 1234 # The pid whose info you're looking for
    if pid in psutil.get_pid_list():
        p = psutil.Process(pid)
        print p.cmdline
    
    14.08.2012
  • Я уже знаю, как получить эту информацию из Linux. Поздравляем с получением этой информации из Python! Вы выиграли мой голос. 14.05.2018

  • 6

    Файловая система proc экспортирует эту (и другую) информацию. Посмотрите на символическую ссылку / proc / PID / cmd.

    17.09.2009

    7

    Это сработало для меня:

    def filter_non_printable(str):
        ret=""
        for c in str:
            if ord(c) > 31 or ord(c) == 9:
                ret += c
            else:
                ret += " "
        return ret
    
    
    #
    # Get /proc/<cpu>/cmdline information
    #
    def pid_name(pid):
        try:
            with open(os.path.join('/proc/', pid, 'cmdline'), 'r') as pidfile:
                return filter_non_printable(pidfile.readline())
    
        except Exception:
            pass
            return
    
    05.08.2015
    Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...