Coś takiego:
PID = 3187: / home / morganc / test1.out
Jak użyć polecenia find, aby wyświetlało numer PID mojego pliku test1.out, a także katalog, w którym znajduje się?
Z góry dziękuję.
Komentarze
Odpowiedź
Możesz wypróbować 2 rozwiązania:
fuser /path/to/opened/file
lub
lsof /path/to/opened/file
Odpowiedź
Jeśli jesteś właścicielem procesu, który utworzył lub ma otwarty plik, ty może zrobić
ls -o /proc/*/fd 2> /dev/null
co spowoduje wyświetlenie wszystkich plików z identyfikatorami PID dla Twojego identyfikatora użytkownika; jeśli nie masz uruchomionych wielu procesów, po prostu ręcznie przejrzyj dane wyjściowe. Przykład: szukanie procesu, który ma vmstat.out
otwarty:
mark (/home/mark)> ls -l /proc/*/fd 2> /dev/null /proc/27669/fd: total 0 lrwx------. 1 mark mark 64 Feb 13 19:51 0 -> /dev/pts/0 lrwx------. 1 mark mark 64 Feb 13 19:51 1 -> /dev/pts/0 lrwx------. 1 mark mark 64 Feb 13 19:53 10 -> /dev/pts/0 lr-x------. 1 mark mark 64 Feb 13 19:53 12 -> /home/mark l-wx------. 1 mark mark 64 Feb 13 19:51 2 -> /dev/null lrwx------. 1 mark mark 64 Feb 13 19:53 4 -> /home/mark/.sh_history /proc/27737/fd: total 0 lrwx------. 1 mark mark 64 Feb 13 19:53 0 -> /dev/pts/0 lrwx------. 1 mark mark 64 Feb 13 19:53 1 -> /dev/pts/0 lrwx------. 1 mark mark 64 Feb 13 19:53 2 -> /dev/pts/0 lr-x------. 1 mark mark 64 Feb 13 19:53 3 -> /home/oracle/log/vmstat.out lr-x------. 1 mark mark 64 Feb 13 19:53 4 -> anon_inode:inotify
Więc PID 27737
ma otwarty plik vmstat.out
, a pełna ścieżka to /home/oracle/log/vmstat.out
Jeśli chcesz odfiltrować większość danych wyjściowych, spróbuj tego:
mark (/home/oracle/log)> ls -l /proc/*/fd 2> /dev/null | grep -E "(^/proc|vmstat.out)" /proc/27669/fd: /proc/27943/fd: lr-x------. 1 mark mark 64 Feb 13 20:00 3 -> /home/oracle/log/vmstat.out /proc/28047/fd: /proc/28048/fd: /proc/self/fd: mark (/home/oracle/log)>
A potem poszukaj PID tuż nad interesującym nas plikiem.
Aby zignorować inne procesy, przesłałem potokiem do awk, zapisując poprzednią linię i wypisując poprzednią linię, gdy znalazłem bieżącą linię zaczynającą się od l
:
ls -l /proc/*/fd 2> /dev/null | \ grep -E "(^/proc|vmstat.out)" | \ awk "BEGIN { prev = $0} /proc/ { prev = $0 } /^l/ { print prev $NF }" /proc/27943/fd:/home/oracle/log/vmstat.out
Odpowiedź
W zależności jeśli chodzi o to, jak interpretuję Twoje pytanie (zobacz komentarze), rozwiązanie będzie następujące:
find $root_dir -name $file_name -exec pidof {} \;
lub:
find $root_dir -name $file_name -exec fuser {} \;
Gdzie definiujesz zmienną $root_dir
jako katalog początkowy, poniżej którego chcesz aby przeprowadzić wyszukiwanie, a $file_name
jako nazwę pliku, którego szukasz.
Pierwsza alternatywa w przypadku wyszukiwania pliku wykonywalnego jest uruchamiany, a druga alternatywa dotyczy przypadku, gdy plik danych jest uruchamiany przez plik wykonywalny.
Aby to przetestować (dla pierwszej alternatywy), otworzyłem plik za pomocą less
, nacisnął C-z
, aby go zatrzymać i umieścić w tle, i uruchomił find /usr/bin -name less -exec pidof {} \;
. Aby przetestować drugą możliwość, utworzyłem plik danych ~/test.txt
, uruchomiłem less ~/test.txt
, a następnie C-z
, po którym następuje find ~ -name test.txt -exec fuser {} \;
.
Komentarze
- Co jeśli 20 osób korzysta z
less
w tym czasie? Myślę, że OP potrzebuje nazwy pliku wyjściowego do wyszukania. - Zrozumiałem, że pytanie jest wyszukiwaniem użycia pliku wykonywalnego, a nie pliku danych, więc w twoim przypadku dostanie dwadzieścia pids i jedną ścieżkę. Widzę jednak, jak inaczej interpretujesz to pytanie, więc ' dodam drugie rozwiązanie w mojej odpowiedzi, aby omówić twoją sprawę, dziękuję.
find
zps
?