Узнайте полный путь к программе, которая запускается при вводе команды

Я ищу надежный способ узнать местоположение в файловой системе программы, которая запускается при вводе команды.

ps -ef дает мне список всех текущих запущенных процессов (-e ] означает каждый, -f означает полный список с соответствующими параметрами).

Итак, чтобы найти местоположение программы uname, я попробовал

grep `uname -n &` `ps -ef`

Я пытаясь поймать идентификатор процесса uname -n и переслать его на grep, который должен вернуть строку, содержащую этот PID, чтобы я мог видеть, какая команда запущена в данный момент.

Я знаю, что есть команды, такие как tee, pipe ... но мне не удалось объединить их для достижения моей цели.

Я полагаю, что есть некоторая функция оболочки, которая возвращает stdout вызываемой функции, что-то например:

stdout(some__command)

, поэтому я мог бы позвонить:

grep stdout(uname -n &) stdout(ps -ef).

Что мне здесь не хватает?

0
задан 23 March 2018 в 17:22

2 ответа

Если все, что вы хотите знать, это местоположение команды

. Если вы хотите узнать, в каком каталоге хранится команда верхнего уровня, у вас есть несколько параметров:

$ which uname /bin/uname $ type -a uname uname is /bin/uname $ locate uname /bin/uname (... SNIP dozens of Windows files on C & D ...) /usr/lib/klibc/bin/uname /usr/lib/plainbox-provider-resource-generic/bin/uname_resource /usr/share/man/man1/uname.1.gz /usr/share/man/man2/oldolduname.2.gz /usr/share/man/man2/olduname.2.gz /usr/share/man/man2/uname.2.gz

Последняя опция locate возвращает все файлы, содержащие uname, а не только программу, которая запускается из командной строки.

strace - трассировка системных вызовов и прерываний

t нужно pid команд, вызываемых для поиска имен различных команд, вызываемых функцией. С strace все имена команд отображаются напрямую.

Для вашего примера uname -n вывод:

$ strace uname -n execve("/bin/uname", ["uname", "-n"], [/* 62 vars */]) = 0 brk(NULL) = 0x2356000 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 fstat(3, {st_mode=S_IFREG|0644, st_size=109073, ...}) = 0 mmap(NULL, 109073, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7ff2f9a9f000 close(3) = 0 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3 read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0P\t\2\0\0\0\0\0"..., 832) = 832 fstat(3, {st_mode=S_IFREG|0755, st_size=1868984, ...}) = 0 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ff2f9a9e000 mmap(NULL, 3971488, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7ff2f94cb000 mprotect(0x7ff2f968b000, 2097152, PROT_NONE) = 0 mmap(0x7ff2f988b000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1c0000) = 0x7ff2f988b000 mmap(0x7ff2f9891000, 14752, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7ff2f9891000 close(3) = 0 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ff2f9a9d000 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ff2f9a9c000 arch_prctl(ARCH_SET_FS, 0x7ff2f9a9d700) = 0 mprotect(0x7ff2f988b000, 16384, PROT_READ) = 0 mprotect(0x606000, 4096, PROT_READ) = 0 mprotect(0x7ff2f9aba000, 4096, PROT_READ) = 0 munmap(0x7ff2f9a9f000, 109073) = 0 brk(NULL) = 0x2356000 brk(0x2377000) = 0x2377000 open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3 fstat(3, {st_mode=S_IFREG|0644, st_size=10219008, ...}) = 0 mmap(NULL, 10219008, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7ff2f8b0c000 close(3) = 0 uname({sysname="Linux", nodename="alien", ...}) = 0 fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 2), ...}) = 0 write(1, "alien\n", 6alien ) = 6 close(1) = 0 close(2) = 0 exit_group(0) = ? +++ exited with 0 +++

Для получения дополнительной информации обратитесь к man strace:

STRACE(1) General Commands Manual STRACE(1) NAME strace - trace system calls and signals SYNOPSIS strace [-CdffhikqrtttTvVxxy] [-In] [-bexecve] [-eexpr]... [-acolumn] [-ofile] [-sstr‐ size] [-Ppath]... -ppid... / [-D] [-Evar[=val]]... [-uusername] command [args] strace -c[df] [-In] [-bexecve] [-eexpr]... [-Ooverhead] [-Ssortby] -ppid... / [-D] [-Evar[=val]]... [-uusername] command [args] DESCRIPTION In the simplest case strace runs the specified command until it exits. It intercepts and records the system calls which are called by a process and the signals which are received by a process. The name of each system call, its arguments and its return value are printed on standard error or to the file specified with the -o option. strace is a useful diagnostic, instructional, and debugging tool. System administra‐ tors, diagnosticians and trouble-shooters will find it invaluable for solving problems with programs for which the source is not readily available since they do not need to be recompiled in order to trace them. Students, hackers and the overly-curious will find that a great deal can be learned about a system and its system calls by tracing even ordinary programs. And programmers will find that since system calls and signals are events that happen at the user/kernel interface, a close examination of this boundary is very useful for bug isolation, sanity checking and attempting to capture race condi‐ tions.

Выше всего лишь начало manpage для strace

5
ответ дан 17 July 2018 в 18:34

Если все, что вы хотите знать, это местоположение команды

. Если вы хотите узнать, в каком каталоге хранится команда верхнего уровня, у вас есть несколько параметров:

$ which uname /bin/uname $ type -a uname uname is /bin/uname $ locate uname /bin/uname (... SNIP dozens of Windows files on C & D ...) /usr/lib/klibc/bin/uname /usr/lib/plainbox-provider-resource-generic/bin/uname_resource /usr/share/man/man1/uname.1.gz /usr/share/man/man2/oldolduname.2.gz /usr/share/man/man2/olduname.2.gz /usr/share/man/man2/uname.2.gz

Последняя опция locate возвращает все файлы, содержащие uname, а не только программу, которая запускается из командной строки.

strace - трассировка системных вызовов и прерываний

t нужно pid команд, вызываемых для поиска имен различных команд, вызываемых функцией. С strace все имена команд отображаются напрямую.

Для вашего примера uname -n вывод:

$ strace uname -n execve("/bin/uname", ["uname", "-n"], [/* 62 vars */]) = 0 brk(NULL) = 0x2356000 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 fstat(3, {st_mode=S_IFREG|0644, st_size=109073, ...}) = 0 mmap(NULL, 109073, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7ff2f9a9f000 close(3) = 0 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3 read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0P\t\2\0\0\0\0\0"..., 832) = 832 fstat(3, {st_mode=S_IFREG|0755, st_size=1868984, ...}) = 0 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ff2f9a9e000 mmap(NULL, 3971488, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7ff2f94cb000 mprotect(0x7ff2f968b000, 2097152, PROT_NONE) = 0 mmap(0x7ff2f988b000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1c0000) = 0x7ff2f988b000 mmap(0x7ff2f9891000, 14752, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7ff2f9891000 close(3) = 0 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ff2f9a9d000 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ff2f9a9c000 arch_prctl(ARCH_SET_FS, 0x7ff2f9a9d700) = 0 mprotect(0x7ff2f988b000, 16384, PROT_READ) = 0 mprotect(0x606000, 4096, PROT_READ) = 0 mprotect(0x7ff2f9aba000, 4096, PROT_READ) = 0 munmap(0x7ff2f9a9f000, 109073) = 0 brk(NULL) = 0x2356000 brk(0x2377000) = 0x2377000 open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3 fstat(3, {st_mode=S_IFREG|0644, st_size=10219008, ...}) = 0 mmap(NULL, 10219008, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7ff2f8b0c000 close(3) = 0 uname({sysname="Linux", nodename="alien", ...}) = 0 fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 2), ...}) = 0 write(1, "alien\n", 6alien ) = 6 close(1) = 0 close(2) = 0 exit_group(0) = ? +++ exited with 0 +++

Для получения дополнительной информации обратитесь к man strace:

STRACE(1) General Commands Manual STRACE(1) NAME strace - trace system calls and signals SYNOPSIS strace [-CdffhikqrtttTvVxxy] [-In] [-bexecve] [-eexpr]... [-acolumn] [-ofile] [-sstr‐ size] [-Ppath]... -ppid... / [-D] [-Evar[=val]]... [-uusername] command [args] strace -c[df] [-In] [-bexecve] [-eexpr]... [-Ooverhead] [-Ssortby] -ppid... / [-D] [-Evar[=val]]... [-uusername] command [args] DESCRIPTION In the simplest case strace runs the specified command until it exits. It intercepts and records the system calls which are called by a process and the signals which are received by a process. The name of each system call, its arguments and its return value are printed on standard error or to the file specified with the -o option. strace is a useful diagnostic, instructional, and debugging tool. System administra‐ tors, diagnosticians and trouble-shooters will find it invaluable for solving problems with programs for which the source is not readily available since they do not need to be recompiled in order to trace them. Students, hackers and the overly-curious will find that a great deal can be learned about a system and its system calls by tracing even ordinary programs. And programmers will find that since system calls and signals are events that happen at the user/kernel interface, a close examination of this boundary is very useful for bug isolation, sanity checking and attempting to capture race condi‐ tions.

Выше всего лишь начало manpage для strace

5
ответ дан 23 July 2018 в 19:22
  • 1
    Большое спасибо! Я пытался найти первую строку в команде strame uname -a, и вы были правы, что PID и grep просто путают людей. – Milos Kalicanin 23 March 2018 в 06:43
  • 2
    @MilosKalicanin, что именно в первой строке вы хотели узнать? Было бы здорово, если бы мы могли прояснить вопрос, чтобы помочь людям найти этот полезный ответ. (PS Если этот ответ помог вам, вы можете поддержать и / или принять его.) – Zanna 23 March 2018 в 12:34
  • 3
    Предложение @MilosKalicanin Zanna, чтобы уточнить ваш вопрос, также означает, что он может быть вновь открыт и / или, вероятно, включен. Уточнение также может привести к публикации различных ответов, которые могут быть более полезными или короткими до точки. – WinEunuuchs2Unix 23 March 2018 в 14:23
  • 4
    Хорошо, вся эта история заключалась в том, чтобы найти, какая команда из файловой системы запускается, когда я набираю «uname -a» в терминале. Я просто забыл, что функция «какие» уже реализована в UNIX. Извините за беспокойство и мое невежество. – Milos Kalicanin 23 March 2018 в 16:34
  • 5
    @MilosKalicanin Я ценю ваши извинения, но я не думаю, что это необходимо. Работая с постоянно меняющимися компьютерами в течение тридцати лет, я узнал, а затем забыл больше, чем я теперь знаю. Ваш вопрос не мешал вообще. На самом деле это помогло некоторым из нас задуматься о том, когда вопросы следует возобновить. Ваш вопрос был закрыт, и теперь я вижу, что он был вновь открыт (до того, как я получил шанс проголосовать за повторное открытие). Кроме того, ваш вопрос был отрицательным, и он получил нейтральный ноль. Поэтому, пожалуйста, не чувствуйте себя плохо. – WinEunuuchs2Unix 24 March 2018 в 03:57

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

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