узнать место, где был выполнен процесс

У меня запущено несколько процессов ruby:

ps -A | grep ruby 
 3518 ?        00:00:12 ruby
10316 ?        00:00:00 ruby
22400 pts/5    00:00:45 ruby
23332 ?        00:00:07 ruby

Я получил pid выше, но я хочу знать, ГДЕ эти процессы находятся в файловой системе. Другими словами, где они были казнены.

Почему я хочу знать? У меня на экране запущен демон, и я хочу знать, откуда он был запущен.

byobu new -s daemon
ls -l
  -rwxrwxr-x 1 someuser someuser   83 Jul  2 11:13 db_service.sh
cat db_service.sh
  #!/bin/sh
  RAILS_ENV=production bundle exec ruby lib/daemons/db_service_ctl start
./script/db_service.sh

Как видно из приведенных выше команд bash, демон был создан (ruby on rails daemon) из сценария оболочки db_service.sh. Так откуда в файловой системе он появился? Может ли ps помочь мне здесь или есть лучшая программа в linux, чтобы узнать нужную информацию? Я не ищу путь установки ruby, а скорее путь, по которому был запущен экземпляр ruby ​​

2
задан 10 July 2013 в 02:56

2 ответа

Итак, вы получили идентификатор процесса, после чего вы можете просмотреть виртуальную файловую систему /proc/. Все есть. Например,

  • /proc/23124/cwd - текущий каталог процесса 23124
  • /proc/23124/cmdline - полная командная строка процесса.
0
ответ дан 10 July 2013 в 02:56

Даже при том, что /proc был упомянут кратко выше как источник информации для приобретения знаний о процессах в системе, я включаю здесь основной сценарий Bash для парсинга некоторой информации из него. Для превосходного введения в /proc виртуальная файловая система, см. эту статью IBM, которая объясняет, как это может быть полезно и для пользователей и для программистов.

Парсинг /proc с универсальным сценарием может быть ненадежным, как различные процессы часто имеют отличающийся /proc разметки, но основная информация могут обычно подбираться с этим сценарием, хотя это, вероятно, придется изменить, если Вы хотите проанализировать определенную информацию. Я записал это с помощью Bash, но существуют лучшие синтаксические анализаторы, которые Вы могли исследовать, если Вы хотите записать это с помощью другого языка сценариев.

Часто в выводе сценария можно видеть, что "разрешение отклонило" сообщение, что означает /proc местоположение не читаемо $USER, таким образом, можно запустить скрипт как корень, если Вы хотите в этом случае получить полный вывод.

Скопируйте тело сценария в новый файл, сохраните его и сделайте его исполняемым файлом (chmod u+x) и затем назовите его по крайней мере с одним аргументом (это теперь может обработать несколько процессов одновременно):

./proc_script xfce4-panel

или вставленный в него Ваш $HOME/bin и затем можно выполнить его как другие программы если $HOME/bin находится в Вашем пути. (Однако при использовании sudo, необходимо будет все еще дать местоположение полного пути сценария, как $HOME/bin не находится в пути корня.)

Тело сценария; это также доступно и обновляется на уровне моей страницы Github:

#!/usr/bin/env bash  

(( $# == 0 )) && { printf "Usage: Please specify the name of one process \
to research.\n" >&2; exit 1; }

args=("$@")                   
for process in "${args[@]}"; do                    
    # store user input in a variable and warn then exit if program is not running
    queried_pid="$(pgrep "${process}" || { printf '%s\n' "No such program" >&2; })"

    # add the contents of the variable into an array
    pidarray=($(echo "$queried_pid"))

    # iterate over the array, however many pids have been found
    for i in "${pidarray[@]}"; do 
        printf "Pid is: %s\nExe is: %s\nCmdline is: %s\ncwd is: %s\n" "$(echo "$i")" \
    "$(stat -c %N /proc/"$i"/exe)" "$(cat /proc/"$i"/cmdline)" "$(cd /proc/"$i"/cwd/; pwd -P)"
    done
    printf "\n\n"
done

exit 

Образец произвел 1:

./proc_parse firefox


Pid is: 1830
Exe is: `/proc/1830/exe' -> `/usr/lib/firefox/firefox'
Cmdline is: /usr/lib/firefox/firefox
cwd is: /home/mike

Демонстрационный Вывод 2 (контакт с несколькими pids):

./proc_parse evince

Pid is: 3113
Exe is: `/proc/3113/exe' -> `/usr/bin/evince'
Cmdline is: evince/home/mike/Z_IBM_lpic_Linux_pdfs/l-proc-pdf.pdf
cwd is: /home/mike
Pid is: 3119
Exe is: `/proc/3119/exe' -> `/usr/lib/evince/evinced'
Cmdline is: /usr/lib/evince/evinced
cwd is: /
1
ответ дан 10 July 2013 в 02:56

Другие вопросы по тегам:

Похожие вопросы: