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

  • czy na pewno nie pomylisz find z ps?
  • Jeśli proces, który utworzył lub ma otwarty plik, nadal działa, odpowiedź Gilles będzie działać. Jeśli proces, który utworzył plik, już nie działa, więc nie ma sposobu, aby dowiedzieć się, co się stało w przeszłości.
  • W jaki sposób plik otrzymał PID?

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ę.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *