У меня запущено несколько процессов 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
Итак, вы получили идентификатор процесса, после чего вы можете просмотреть виртуальную файловую систему /proc/
. Все есть. Например,
/proc/23124/cwd
- текущий каталог процесса 23124 /proc/23124/cmdline
- полная командная строка процесса. Даже при том, что /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: /