Intereting Posts
Линейка приложений для корневого приложения Linux Mint ломается при изменении элементов управления Быстрый способ открыть удаленный файл в vim в командной строке Сравнение двух файлов по горизонтали и по вертикали отправлять сообщения об ошибках, отправленные на консоль? Почему я не могу инициализировать фиктивный интерфейс в bashrc? Есть ли простой способ программно извлечь IP-адрес? Как вы поддерживаете сервисные службы systemd в режиме mosh? Есть ли полнофункциональные читатели в формате PDF, которые интегрируют функцию комментариев? Обычные уведомления по полноэкранным приложениям в Gnome 3 gvim pipe не читает zshrc при запуске с рабочего стола Найти первое появление каждого из этих шаблонов с помощью grep Как я могу запретить доступ в Интернет ко всем процессам, кроме избранных? Проблема с печатью с помощью службы ArchLinux и CUPS Системная (неявная?) Перезагрузка Почему оболочка Command Substitution сжимает конечный символ новой строки?

Параметры командной строки для стойки не отображаются в выводах ps или procfs

Как вы знаете, хотите ли вы получить аргументы командной строки командной строки для запуска команды, вы можете разобрать ps -e или /proc/<pid>/cmdline .

Но я столкнулся с проблемой, когда этот метод возвращает только команду с пустым, но без аргументов. Например:

 $ rackup private_pub.ru -s thin -E production Thin web server (v1.5.1 codename Straight Razor) Maximum connections set to 1024 Listening on 0.0.0.0:9292, CTRL+C to stop $ ps -e | grep rackup 16226 ttys001 0:02.19 /home/user/.rvm/gems/ruby-1.9.3-p429@gearup/ bin/rackup $ xargs -0 echo < /proc/16226/cmdline /home/user/.rvm/gems/ruby-1.9.3-p429@gearup/bin/rackup 

Нет private_pub.ru и последующих аргументов.

Могут ли rackup «проглотить» опции и сделать их невидимыми для ps ?

В чем причина такого поведения? Моя основная проблема – найти определенный процесс с определенным аргументом с ps или procfs .

Выход для strace -rf -e trace=process rackup

 0.000000 execve("/home/user/.rvm/gems/ruby-1.9.3-p385@global/bin/rackup", ["rackup", "private_pub.ru", "-s", "thin", "-E", "production"], [/* 89 vars */]) = 0 0.003323 arch_prctl(ARCH_SET_FS, 0x7f1f1b1b1740) = 0 0.001193 execve("/home/user/.rvm/gems/ruby-1.9.3-p385@gearup/bin/ruby_noexec_wrapper", ["ruby_noexec_wrapper", "/home/user/.rvm/gems/ruby-1.9.3-p"..., "private_pub.ru", "-s", "thin", "-E", "production"], [/* 89 vars */]) = 0 0.002065 arch_prctl(ARCH_SET_FS, 0x7f04829a8740) = 0 0.001028 execve("/home/user/.rvm/gems/ruby-1.9.3-p385@gearup/bin/ruby", ["ruby", "/home/user/.rvm/gems/ruby-1.9.3-p"..., "/home/user/.rvm/gems/ruby-1.9.3-p"..., "private_pub.ru", "-s", "thin", "-E", "production"], [/* 89 vars */]) = -1 ENOENT (No such file or directory) 0.000294 execve("/home/user/.rvm/gems/ruby-1.9.3-p385@global/bin/ruby", ["ruby", "/home/user/.rvm/gems/ruby-1.9.3-p"..., "/home/user/.rvm/gems/ruby-1.9.3-p"..., "private_pub.ru", "-s", "thin", "-E", "production"], [/* 89 vars */]) = -1 ENOENT (No such file or directory) 0.000286 execve("/home/user/.rvm/rubies/ruby-1.9.3-p385/bin/ruby", ["ruby", "/home/user/.rvm/gems/ruby-1.9.3-p"..., "/home/user/.rvm/gems/ruby-1.9.3-p"..., "private_pub.ru", "-s", "thin", "-E", "production"], [/* 89 vars */]) = 0 0.005911 arch_prctl(ARCH_SET_FS, 0x7f4c84595740) = 0 0.013703 clone(Process 9182 attached child_stack=0x7f4c845c1fb0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7f4c845c29d0, tls=0x7f4c845c2700, child_tidptr=0x7f4c845c29d0) = 9182 >> Thin web server (v1.5.1 codename Straight Razor) >> Maximum connections set to 1024 >> Listening on 0.0.0.0:9292, CTRL+C to stop 

Вы не указали свою ОС, а ps достаточно специфична для ОС (и для Linux, для дистрибутива). Как Linux, так и FreeBSD по крайней мере соответствуют вашему использованию /proc . ps -e выводит только comm (возможно, усеченную команду), а не аргументы.

В Linux или * BSD попробуйте ps :

 ps axwwo "pid ppid uid comm args" 

args – это поле, которое вам, вероятно, понадобится, а двойные опции «w» позволяют «неограниченную ширину» вывода. Полный путь может превышать доступное пространство ( ps предпочитает одну строку для каждого процесса и проверяет вашу ширину терминала), поэтому вы не обязательно увидите полный путь или аргументы.

Однако ваше использование /proc/xx/cmdline верное, аргументов просто нет.

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

 strace -rf -e trace=process rackup ... 

чтобы увидеть, что происходит.

Вы должны иметь возможность использовать параметр -P или --pid для установки файла PID для каждого экземпляра, тогда вы можете отслеживать и различать конкретные экземпляры, если это то, что вы пытаетесь сделать.

В общем, хотя pgrep или pidof являются лучшими инструментами для идентификации процессов по имени и / или аргументам.

Вы обязательно должны начать читать man-страницы . Пример из man ps ( онлайн-справочная страница ):

 -f Do full-format listing. This option can be combined with many other UNIX-style options to add additional columns. It also causes the command arguments to be printed. When used with -L, the NLWP (number of threads) and LWP (thread ID) columns will be added. See the c option, the format keyword args, and the format keyword comm. 

Таким образом, попробуйте запустить ps -ef | grep rackup ps -ef | grep rackup 😉

Конечно, программы могут получать (изменять и удалять) свои аргументы. Это считается функцией безопасности, особенно когда могут отображаться имена пользователей, пароли и другая конфиденциальная информация. Адреса, порты, ключи разделяемой памяти и другая информация также могут считаться чувствительными.

Процессы Daemon и другие серверы, в которых также выполняются дочерние процессы fork / exec, могут пролить аргументы как часть их обработки.