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