如您所知,如果您希望获取运行命令的命令行运行时参数,您可以解析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 文件,然后您可以监视并区分特定实例(如果您想要这样做)。
一般来说,pgrep
或pidof
是通过名称和/或参数识别进程的最佳工具。
答案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 子进程的服务器也可以在处理过程中删除参数。