Хорошо, таким образом, вот мои ответы на мои вопросы.
Во-первых: я могу предположить, что путь proftpd является первым, я найду ввод whereis как корень?
==> Нет, по крайней мере, с моим опытом это не показывает достоверной информации для определения исполнимого пути процесса.
Во-вторых: Как определить исполняемый путь рабочего процесса?
Я нашел stackoverflow тему, которые указывают эту возможность, которая является до сих пор единственной, которая показала мне корректный ответ:
svmon -P <PID> -O format=nolimit,filename=on,filtertype=client
Проблема с этой командой состоит в том, что необходимо ожидать, пока она не показывает Вам информацию, которую Вы хотите, но она, вероятно, даст Вам ответ через некоторое время. Другая проблема состоит в том, что, этот метод не может быть использованием в сценарии.
В-третьих: относительно, "почему ps -ef
не показывает ни полного, ни относительного пути"
Ответ, вероятно (но не стесняйтесь исправлять меня), что он показывает фактическую команду, введенную пользователем, итак, если root
был в папке, содержащей proftpd
затем это только покажет proftpd
Никакая идея до сих пор.
Это - до сих пор лучший ответ, я могу, придумал.
Редактирование 1:
Способ Scriptable найти путь рабочего исполняемого файла (этот метод не появляется от меня, но от этого сообщения форума). Обратите внимание, что я не предоставлю сценарий, потому что это - путь по моим возможностям, и у меня нет времени прямо сейчас.
Первый шаг должен получить inode Вашего исполняемого двоичного файла
ls -i /proc/<PID>/object/a.out | cut -f 1 -d " "
Эта команда произведет число.
Затем необходимо определить устройство, на котором файл для этого, смотрят на ту команду:
ls -li /proc/<PID>/object/ | egrep "<inode>$"
Эта команда, в то время как дают Вам название файла как это: jfs2.51.3.<inode>
. jfs2
тип файловой системы, 51
число основного устройства и 3
незначительный номер устройства.
После того как Вы определяете информацию об устройстве, мы должны определить блочное устройство, где файл расположен со следующей командой:
ls -l /dev/ | egrep "^b.*51, *3.+$"
^b.*51, *3.+$
^b
используется для соответствия блочному устройству
51, *3
соответствует главному блоку 51
сопровождаемый запятой и любым пространством и незначительным номером блока 3
найдите ранее.
Эта команда, в то время как дают Вам что-то как:
brw-rw---- 1 root system 51, 3 24 feb 2009 myfilesystem
Можно затем определить точку монтирования блока как это:
df | grep myfilesystem
/dev/myfilesystem 31457280 144544 100% 107442 81% /opts
Вы теперь знаете, где необходимо искать число:
find /opts -inum <inode>
Я признаю, что этот метод является немного сложным, но это - единственное до сих пор, я нашел, что это "легко scriptable". Если кто-то когда-нибудь пишет сценарий, я был бы довольный считать его.
getPathByPid()
{
if [[ -e /proc/$1/object/a.out ]]; then
inode=`ls -i /proc/$1/object/a.out 2>/dev/null | awk '{print $1}'`
if [[ $? -eq 0 ]]; then
strnode=${inode}"$"
strNum=`ls -li /proc/$1/object/ 2>/dev/null | grep $strnode | awk '{print $NF}' | grep "[0-9]\{1,\}\.[0-9]\{1,\}\."`
if [[ $? -eq 0 ]]; then
# jfs2.10.6.5869
n1=`echo $strNum|awk -F"." '{print $2}'`
n2=`echo $strNum|awk -F"." '{print $3}'`
# brw-rw---- 1 root system 10, 6 Aug 23 2013 hd9var
strexp="^b.*"$n1,"[[:space:]]\{1,\}"$n2"[[:space:]]\{1,\}.*$" # "^b.*10, \{1,\}5 \{1,\}.*$"
strdf=`ls -l /dev/ | grep $strexp | awk '{print $NF}'`
if [[ $? -eq 0 ]]; then
strMpath=`df | grep $strdf | awk '{print $NF}'`
if [[ $? -eq 0 ]]; then
find $strMpath -inum $inode 2>/dev/null
if [[ $? -eq 0 ]]; then
return 0
fi
fi
fi
fi
fi
fi
return 1
}
cd
к каталогу и запуску исполняемый файл с относительным путем. Вы ничего не можете принять. – JRFerguson 14.01.2014, 13:53