Как мы можем получить командную строку запущенного приложения?

Вы можете ввести команду

arp -a

в терминале, чтобы увидеть компьютеры на Lan.

1
задан 18 February 2014 в 14:39

5 ответов

Отсюда:

xprop | awk '($1=="_NET_WM_PID(CARDINAL)") {print $3}' | xargs ps h -o pid,cmd

Если вам нужна только начальная командная строка, тогда просто:

xprop | awk '($1=="_NET_WM_PID(CARDINAL)") {print $3}' | xargs ps h -o cmd

После запуска команды просто щелкните по окну для который вы хотите, чтобы команда запуска была показана.

12
ответ дан 24 May 2018 в 17:48

Альтернативный скрипт:

#!/bin/bash

# Copyright © 2013  minerz029
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

shopt -s extglob

for var in 'wm_pid' 'wm_name' 'wm_class' 'cmdline' 'wm_id'; do
    declare "$var"'=Not found'
done

notify-send -t 3000 'Click on a window to get the command line...'
xprop_out="$(xprop)"

while IFS=$'\n' read -r -d $'\n' line; do
    if [[ "$line" == '_NET_WM_PID(CARDINAL) = '* ]]; then
        wm_pid="${line#_NET_WM_PID(CARDINAL) = }"
    elif [[ "$line" == 'WM_NAME('?(UTF8_)'STRING) = '* ]]; then
        wm_name="${line#WM_NAME(?(UTF8_)STRING) = }"
    elif [[ "$line" == 'WM_CLASS('?(UTF8_)'STRING) = '* ]]; then
        wm_class="${line#WM_CLASS(?(UTF8_)STRING) = }"
    elif [[ "$line" == 'WM_CLIENT_LEADER(WINDOW): window id # '* ]]; then
        wm_id="${line#WM_CLIENT_LEADER(WINDOW): window id # }"
    fi
done <<< "$xprop_out"

if [[ "$wm_pid" == +([0-9]) ]]; then
    quote () 
    { 
        local quoted="${1//\'/\'\\\'\'}";
        out="$(printf "'%s'" "$quoted")"
        if eval echo -n "$out" >/dev/null 2>&1; then
            echo "$out"
        else
            echo "SEVERE QUOTING ERROR"
            echo "IN: $1"
            echo -n "OUT: "
            eval echo -n "$out"
        fi
    }
    cmdline=()
    while IFS= read -d '' -r arg; do
        cmdline+=("$(quote "$arg")")
    done < "/proc/$wm_pid/cmdline"
fi

text="\
Title:
    $wm_name
Class:
    $wm_class
ID:
    $wm_id
PID:
    $wm_pid

Command line:
    ${cmdline[@]}"

copy() {
    { echo -n "$1" | xsel -i -b >/dev/null; } && xsel -k
}

if [[ -t 1 ]]; then
    echo "$text"
    if [[ "$1" == '--copy' ]]; then
        echo "Copied"
        copy "$cmdline"
    fi
else
    zenity \
        --title='Window information' \
        --width=750 \
        --height=300 \
        --no-wrap \
        --font='Ubuntu Mono 11' \
        --text-info \
        --cancel-label='Copy' \
        --ok-label='Close' \
    <<< "$text"
    if [[ $? == 1 ]]; then
        copy "$cmdline"
    fi
fi

Использование:

Сохраните вышеуказанный скрипт в файл и сделайте его исполняемым. Запустите файл двойным щелчком и выберите «Выполнить». Нажмите на окно, в котором вы хотели бы знать команду. Информация будет отображаться вам. (Title, PID, ID, class и command line). Вы можете нажать кнопку «Копировать», чтобы скопировать командную строку в буфер обмена. Для этого необходимо установить xsel.

6
ответ дан 24 May 2018 в 17:48
  • 1
    очень приятное выполнение сценариев оболочки. +1 от меня – souravc 14 January 2014 в 09:33

В качестве альтернативы, не требующей сценария, вы можете просто открыть системный монитор и навести указатель мыши на процесс, который вы хотели бы знать в командной строке.

Если вы включите «Вид зависимостей», вы сможете увидеть, какой процесс называется другим, например, вы можете увидеть различные процессы, которые Chrome создает для каждой вкладки, и отследить их обратно в родительский который будет иметь командную строку, с которой был вызван Chrome (пользователем).

4
ответ дан 24 May 2018 в 17:48
  • 1
    Это не будет работать все время. Быстрый пример - это менеджер файлов по умолчанию из Ubuntu - Nautilus. – Radu Rădeanu 27 October 2013 в 13:36
  • 2
    @ RaduRădeanu Конечно, он не получает команду от альтернативного имени (файлов) nautilus, но если вам просто нужен простой способ получить аргументы, это будет работать нормально. Вы все равно можете распознать значок – kiri 27 October 2013 в 13:38

Самое похожее, что я нашел, это xwininfo, который дает вам информацию о запущенном окне. Но это не говорит вам, какая программа работает внутри него.

1
ответ дан 24 May 2018 в 17:48

Еще один способ перечислить имя команды и аргументы запущенных процессов:

ps axk pid,comm o comm,args > output.txt

(Перенаправить в файл, чтобы имена / аргументы команды не были усечены.)

[d2 ] Источник: man ps: раздел примеров (с небольшой модификацией).

Системный монитор - это графический интерфейс для ps.

0
ответ дан 24 May 2018 в 17:48
  • 1
    Вы всегда можете использовать grep, чтобы найти команду, если у вас есть неопределенная идея. – kiri 27 October 2013 в 13:25

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

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