Список всех файлов, используемых сценарием оболочки - PullRequest
0 голосов
/ 31 мая 2018

У меня есть сценарий ksh, который вызывает много других сценариев.Эти сценарии дополнительно содержат операторы execute, указывающие на множество других сценариев, и используют гораздо больше конфигурационных файлов.Если все эти сценарии и файлы конфигурации не находятся в одной и той же папке, то как я могу найти имя и расположение каждого выполняемого сценария и файл конфигурации, используемый при выполнении основного сценария?

1 Ответ

0 голосов
/ 01 июня 2018

Вы можете использовать утилиту strace для отслеживания системных вызовов, выполняемых процессом и его дочерними элементами.

Например, с помощью этого простого сценария, который обращается к файлу в том же каталоге и файлу в другом месте наsystem:

$ cat strace-test.sh
#!/bin/sh
cat local-file.txt > /dev/null
cat /etc/issue > /dev/null

Вот результат работы strace при выполнении этого скрипта:

$ strace -q -f -t -e trace=openat bash strace-test.sh
01:42:10 openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
01:42:10 openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libtinfo.so.6", O_RDONLY|O_CLOEXEC) = 3
01:42:10 openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libdl.so.2", O_RDONLY|O_CLOEXEC) = 3
01:42:10 openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
01:42:10 openat(AT_FDCWD, "/dev/tty", O_RDWR|O_NONBLOCK) = 3
01:42:10 openat(AT_FDCWD, "/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
01:42:10 openat(AT_FDCWD, "/usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache", O_RDONLY) = 3
01:42:10 openat(AT_FDCWD, "strace-test.sh", O_RDONLY) = 3
[pid 24729] 01:42:10 openat(AT_FDCWD, "/dev/null", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
[pid 24729] 01:42:10 openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
[pid 24729] 01:42:10 openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
[pid 24729] 01:42:10 openat(AT_FDCWD, "/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
[pid 24729] 01:42:10 openat(AT_FDCWD, "local-file.txt", O_RDONLY) = 3
[pid 24729] 01:42:10 +++ exited with 0 +++
01:42:10 --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=24729, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
[pid 24730] 01:42:10 openat(AT_FDCWD, "/dev/null", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
[pid 24730] 01:42:10 openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
[pid 24730] 01:42:10 openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
[pid 24730] 01:42:10 openat(AT_FDCWD, "/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
[pid 24730] 01:42:10 openat(AT_FDCWD, "/etc/issue", O_RDONLY) = 3
[pid 24730] 01:42:10 +++ exited with 0 +++
01:42:10 --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=24730, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
01:42:10 +++ exited with 0 +++

В этом выводе есть две строки, документирующие ожидаемый доступ к файлу:

...
[pid 24729] 01:42:10 openat(AT_FDCWD, "local-file.txt", O_RDONLY) = 3
...
[pid 24730] 01:42:10 openat(AT_FDCWD, "/etc/issue", O_RDONLY) = 3
...

Конечно, в реальном скрипте, выполняющем настоящую работу, у вас будет намного больше выходных данных для просмотра.Вот где grep приходит, чтобы помочь с поиском по нему.

$ sh -c "strace -q -f -t -e trace=openat bash strace-test.sh" 2>&1 \
  | grep openat \  # only match lines that include "openat"
  | grep -v -E '(.so|/usr/lib|/dev)'  # exclude lines that match 
                                      # "uninteresting" files
[pid 22711] 15:02:35 openat(AT_FDCWD, "local-file.txt", O_RDONLY) = 3
[pid 22712] 15:02:35 openat(AT_FDCWD, "/etc/issue", O_RDONLY) = 3 
...