rackup 的命令行选项未显示在 ps 输出或 procfs 中

rackup 的命令行选项未显示在 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

答案1

您还没有说明您的操作系统,并且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可执行文件是 shell 脚本而引起的,我猜测该脚本是短暂的,并且参数被吸入 Ruby 的ARGV.你可以试试

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

看看发生了什么。

您应该能够使用rackup-P--pid选项来记录每个实例的PID 文件,然后您可以监视并区分特定实例(如果您想要这样做)。

一般来说,pgreppidof是通过名称和/或参数识别进程的最佳工具。

答案2

你绝对应该开始阅读手册页。一个例子来自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;-)

答案3

当然,程序可以访问(更改和删除)它们的参数。这被认为是一项安全功能,特别是当用户名、密码和其他敏感信息可能泄露时。地址、端口、共享内存密钥和其他信息也可以被视为敏感信息。

守护进程和其他 fork/exec 子进程的服务器也可以在处理过程中删除参数。

相关内容