Как отождествить исполняемый путь с его PID на AIX 5 или больше

Я искал что-то как этот и нашел XtreemFS

http://www.xtreemfs.org/

6
22.02.2018, 14:14
2 ответа

Хорошо, таким образом, вот мои ответы на мои вопросы.

  • Во-первых: я могу предположить, что путь 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". Если кто-то когда-нибудь пишет сценарий, я был бы довольный считать его.

4
27.01.2020, 20:28
  • 1
    Скопируйте свой исполняемый файл в любой каталог; cd к каталогу и запуску исполняемый файл с относительным путем. Вы ничего не можете принять. –  JRFerguson 14.01.2014, 13:53
  • 2
    @JRFerguson о том, какая часть ответа Вы не соглашаетесь?Я не понимаю. –  Kiwy 14.01.2014, 14:15
  • 3
    , я не соглашаюсь конкретно по точке 3. Снова, моя правовая оговорка: у Меня в настоящее время нет доступа к машине AIX. Я надеялся бы, что Вы нашли что-то полезным в моих предложениях, независимо. –  JRFerguson 14.01.2014, 15:52
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
}
2
27.01.2020, 20:28

Теги

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