Вы можете использовать утилиту 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