Jak zamknąć deskryptor pliku z innego procesu w systemach unix

Możesz użyć komendy lsof Aby pobrać deskryptory plików dla wszystkich uruchomionych procesów, ale chciałbym zamknąć niektóre z tych deskryptorów bez bycia wewnątrz tego procesu. Można to zrobić w systemie Windows, dzięki czemu można łatwo odblokować niektóre aplikacje.

Czy jest do tego jakieś polecenie lub funkcja?

Author: Seb, 2008-11-27

5 answers

W Windows możesz użyć programu, aby to zrobić, ponieważ ktoś napisał program, który wstawia sterownik urządzenia do uruchomionego jądra, aby to zrobić. Przy okazji może to być niebezpieczne, ponieważ po zamknięciu uchwytu, którego używała zepsuta aplikacja, aplikacja nie wie, że uchwyt został zamknięty, a gdy aplikacja otworzy inny niepowiązany obiekt, nie wie, że ten sam uchwyt może teraz odnosić się do innego niepowiązanego obiektu. Naprawdę chcesz zabić zepsutych aplikacja jak najszybciej.

W Linuksie z pewnością można użyć tej samej techniki. Napisz program, który wstawia moduł do działającego jądra. Komunikuj się z modułem i powiedz mu, które uchwyty należy zamknąć. Będzie to równie niebezpieczne.

 2
Author: Windows programmer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-27 07:48:07

Nie wiem, dlaczego próbujesz to zrobić, ale powinieneś być w stanie dołączyć do procesu za pomocą gdb, a następnie wywołać close() na fd. Przykład:

W jednej powłoce: kot

W innej powłoce:

$pidof cat
7213

$gdb -p 7213

...
lots of output
...

(gdb)

Teraz każ gdb wykonać close(0):

(gdb) p close(0)

$1 = 0

(gdb) c

Continuing.

Program exited with code 01.
(gdb)

W pierwszej powłoce dostaję to wyjście:

cat: -: Bad file descriptor

cat: closing standard input: Bad file descriptor
 75
Author: Andreas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-26 18:36:28

Nie sądzę, ale lsof daje Ci PID procesu, który otworzył plik, więc możesz całkowicie zabić proces lub przynajmniej wysłać sygnał, aby go zakończyć.

 3
Author: Fernando Miguélez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-27 07:51:15

Jest znacznie mniej potrzeby, aby to zrobić na Unix niż na Windows.

W systemie Windows większość programów ma tendencję do "blokowania" (w rzeczywistości odmawiania udostępniania) plików, które otwierają, więc nie mogą być odczytywane/zapisywane/usuwane przez inny program.

Na Unixie w większości przypadków tak się nie dzieje. Blokowanie plików w systemie Unix jest głównie doradcze i blokuje tylko inne próby blokowania, a nie normalne operacje odczytu/zapisu/usuwania. Możesz nawet usunąć bieżący katalog procesu.

O jedynym sytuacja ta pojawia się w normalnym użyciu w Unixie podczas próby umountowania systemu plików (każde odniesienie do zamontowanego systemu plików może zablokować umount).

 2
Author: CesarB,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-29 18:09:21

Wątpię. Deskryptory plików są Proces-local, stdout jest 1 dla wszystkich procesów, ale nadal odwołują się do unikalnych strumieni oczywiście.

Być może przydałoby się więcej szczegółów na temat problemu blokowania, który próbujesz rozwiązać.

 1
Author: unwind,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-27 07:50:27