Chcę napisać coś w rodzaju nadzorcy i próbuję zaimplementować funkcję, która zamyka zewnętrzny program. Proces zewnętrzny jest połączony z kodem erlanga za pomocą portu. Nie mam pojęcia, jak zamknąć ten program, wysyłając sygnał lub cokolwiek innego. Zamknięcie portu nie jest rozwiązaniem, ponieważ sprawdziłem, że wiele programów nie wychodzi z SIGPIPE. Czy masz jakieś pomysły, jak to zrobić?Zabijanie procesu podłączonego do portu erlanga
Odpowiedz
Można użyć
{os_pid, OsPid} = erlang:port_info(Port, os_pid).
uzyskać PID procesu w systemie operacyjnym (patrz http://erlang.org/doc/man/erlang.html#port_info-1 - Myślę, że być może trzeba najnowszą wersję Erlang na to, aby zostać włączone, myślę, że ten, zainstalowany przez apt-get na Ubuntu 12.04 nie jest na tyle niedawno, wiem R15B02 ma go jednak), a następnie
os:cmd(io_lib:format("kill -9 ~p", [OsPid])).
aby go (http://erlang.org/doc/man/os.html#cmd-1) zabić.
To zadziałało dla mnie, ale czy możesz wyjaśnić, dlaczego wysłałeś sygnał zabicia? To tylko przykład, czy istnieją pewne powody, aby zakończyć proces w ten sposób? –
Zapytałeś, jak zabić proces :) Możesz również wysłać wiadomość do procesu przez port za pomocą polecenia erlang: port_command/2 i nakazać mu delikatne zatrzymanie. –
Możesz zabić proces zewnętrzny, jeśli zabijesz połączony proces erlang. Użyj tej metody:
-module(portest).
-export([start/1, init/1, kill/0]).
start(ExtPrg) ->
spawn(?MODULE, init, [ExtPrg]).
init(ExtPrg) ->
process_flag(trap_exit, true),
Port = open_port({spawn, ExtPrg}, [{packet, 2}]),
register(extport, self()),
loop(Port).
kill() ->
exit(whereis(extport), kill).
Nie można jednak zabić procesu zewnętrznego, który został zablokowany przez odczyt IO.
- 1. "Z wdziękiem" zabijanie procesu
- 2. Zabijanie procesu poprzez sshj
- 3. Uzyskiwanie nazwy portu podłączonego urządzenia USB
- 4. C#: proces zamykania procesu "zabijanie procesu" (z zadaniem)
- 5. Capistrano zabijanie aktywa: prekompilacji
- 6. Jak uzyskać nazwę procesu otwartego portu w języku C#?
- 7. Jak zdobyć PID i nr portu dla procesu Jenkinsa
- 8. AppleEvents: Wyślij portu dla procesu ma prawo wysyłania
- 9. uWSGI i wdzięcznie zabijanie wielowątkowej aplikacji Flask
- 10. dynamiczne odnajdywanie podłączonego komponentu
- 11. Zabijanie podproces tym jego dzieci z pytona
- 12. Styl Erlanga - dopasowanie przypadku do dopasowania funkcji
- 13. Dodaj ścieżkę do ścieżki wyszukiwania Erlanga?
- 14. Prosty przykład użycia Erlanga do https post
- 15. Sprawdź status podłączonego urządzenia bluetooth.
- 16. Problem powłoki Erlanga
- 17. Czy liczniki czasu Erlanga?
- 18. Node.js - przekazuje cały ruch z portu A do portu B
- 19. Zapytanie o proces Erlanga dla jego stanu?
- 20. Dostęp do portu szeregowego HTML5?
- 21. Przekierowanie wyjścia fprintf do portu
- 22. Tryb emacs Erlanga - ustawienie outdir
- 23. zabijanie elementów w kolejce dispatch_async w iOS
- 24. Wyślij sygnał do procesu
- 25. Biblioteki Erlanga JSON: wydajność serializacji?
- 26. Samouczek lub przykład Erlanga Corby?
- 27. Rejestry w Erl (pytanie Erlanga)
- 28. Wykryj podczas noszenia podłączonego/odłączonego do/z telefonu z Androidem
- 29. MySQLDump do komputera lokalnego ze zdalnego serwera podłączonego przez SSH
- 30. Emacs, zabijanie procesów wewnętrznych, dowolne polecenie?
Czy jest na tym samym urządzeniu? Czy masz PID? –