As opções de linha de comando do rackup não são mostradas na saída do ps ou no procfs

3

Como você sabe se deseja obter argumentos de tempo de execução da linha de comando para executar o comando, é possível analisar ps -e ou /proc/<pid>/cmdline .

Mas eu encontrei o problema quando este método retorna apenas o comando com o caminho, mas sem argumentos. Por exemplo:

$ 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

Não há private_pub.ru e argumentos subseqüentes.

Pode rackup "engolir" opções e torná-las invisíveis para ps ?

Qual é a razão para esse comportamento? Meu principal problema é encontrar determinado processo com um determinado argumento com ps ou procfs .

Saída para 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
    
por coldday 17.10.2013 / 10:19

3 respostas

2

Você não declarou seu sistema operacional e ps é bastante específico do sistema operacional (e no Linux, distribuição específica). Tanto o Linux quanto o FreeBSD, pelo menos, correspondem ao seu uso de /proc . ps -e produz apenas comm (o "comando" possivelmente truncado) e não os argumentos.

No Linux ou * BSD, tente por ps :

ps axwwo "pid ppid uid comm args"

args é o campo que você provavelmente precisa, e as opções double "w" permitem "largura ilimitada" de saída. O caminho completo pode exceder o espaço disponível ( ps prefere uma linha por processo e verifica a largura do seu terminal), portanto você não verá necessariamente o caminho ou os argumentos completos.

No entanto, o uso de /proc/xx/cmdline está correto, simplesmente não há argumentos.

O segundo problema provavelmente surge do fato de o executável rackup ser um shell script, estou supondo que o script tenha vida curta e que os argumentos sejam sugados para o ARGV de Ruby. Você pode tentar

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

para ver o que está acontecendo.

Você deve ser capaz de usar a opção -P ou --pid do rackup para gravar um arquivo PID para cada instância e, em seguida, monitorar e distinguir instâncias específicas, se é isso que você está tentando fazer.

Em geral, embora pgrep ou pidof sejam as melhores ferramentas para identificar processos por nome e / ou argumentos.

    
por 17.10.2013 / 11:44
0

Você deve definitivamente começar a ler páginas do manual . Um exemplo de man ps ( página man online ):

-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.

Assim, tente executar ps -ef | grep rackup ; -)

    
por 17.10.2013 / 10:28
0

Certamente, os programas podem acessar (alterar e excluir) seus argumentos. Isso é considerado um recurso de segurança, especialmente quando nomes de usuário, senhas e outras informações confidenciais podem ser expostos. Endereços, portas, chaves de memória compartilhadas e outras informações também podem ser consideradas confidenciais.

Os processos do daemon e outros servidores que processos fork / exec filho também podem lançar argumentos como parte de seu processamento.

    
por 18.10.2013 / 03:03