W wierszu poleceń wpisałem polecenie i wcisnąłem Enter. Nic nie wyprowadza. Skąd mam wiedzieć, czy jest uruchomiony i nie jest jeszcze generowany, czy prosi użytkownika o podanie danych?
command-line
process
io
Gqqnbig
źródło
źródło
PS1
monit.cat
polecenie. Po prostu wpiszcat
sam i poczeka na dane wejściowe ze standardowego wejścia, ale nie wyświetli monitu. Wiele innych poleceń zachowuje się podobnie, ponieważ oczekują danych wejściowych od standardowego lub pliku, ale nie rozróżniają różnych źródeł wejściowych (terminal interaktywny, potok, plik ...).Odpowiedzi:
Istnieje kilka podejść:
Spróbuj zasygnalizować koniec wejścia : Bez uprawnień administratora bardzo trudno jest wiedzieć, co dzieje się pod maską. Można nacisnąć Ctrl+ d. Terminale i narzędzia w trybie kanonicznym wysyłają cały dostępny tekst do
read()
syscall po otrzymaniu sygnału EOT związanego z tą kombinacją klawiszy, a jeśli nie ma wejścia -read()
zwraca ujemny status wyjścia, który większość narzędzi przyjmuje jako sygnał do wyjścia. Dlatego jeśli narzędzie czeka na dane wejściowe, zakończy działanie po otrzymaniu kombinacji klawiszy. W przeciwnym razie narzędzie uruchomi zadania lub nie zostanie poprawnie zapisane.Szpiegowanie połączeń syscall : jeśli masz uprawnienia administratora, możesz uruchomić
strace
w innym terminalu, aby zobaczyć, co jest aktualnie wykonywane. W tym celu musisz znaleźć PID programu. Na przykład w innej zakładce terminala uruchom,pgrep -f firefox
która może 1234 jako przykład, a następniesudo strace -f -p 1234
. Jeśli wyjście, które widzisz, utknęło wread()
syscall, oznacza to, że polecenie prawdopodobnie czeka na wejście. W przeciwnym razie, jeśli widzisz uruchamiane syscalls, polecenie robi coś innego. Zobacz powiązane pytanie do wykorzystaniastrace
również dowiedzieć się, czy polecenie długo uruchomiony został zakończony.Używaj własnych metod polecenia : między innymi takich narzędzi, jak
dd
użycie sygnałów. Na przykład, jeśli użyjeszkill -USR1 1234
(gdzie 1234 jest PID uruchomionejdd
komendy), to wypisuje na standardowe wyjście ilość aktualnie przetwarzanych bajtów. Oczywiście wymaga to przede wszystkim wiedzy o takim zachowaniu polecenia. Powyższe dwie metody są bardziej ogólne i nie wymagają dogłębnej znajomości zachowania każdego polecenia (chociaż zawsze najlepiej wiedzieć, co faktycznie wykonujesz - w przeciwnym razie ryzykujesz wykonanie polecenia, które może spowodować obrażenia).źródło
strace
metodę :-) Przydają się również prostsze metody (ogólne lub specyficzne dla każdego programu). Niektóre z nich działają bez uprawnień administratora. Przykłady: sprawdź, czydd
coś robi i sprawdź, dlaczegogrep --color asdf
czeka w ciszy.dd
dodaniu tego.Jak stwierdzić, czy program jest uruchomiony, czy chce danych wejściowych od użytkownika
To zależy od programu i sposobu jego wywołania.
Często, ale nie zawsze, pojawi się monit, który wskazuje, że program prosi o dane wejściowe.
Jeśli nie masz pewności, możesz sprawdzić, czy proces programu jest zajęty
używa procesora - użyj
top
lubhtop
czyta lub pisze - użyj
sudo iotop -o
A kiedy program się zakończy, zobaczysz monit powłoki.
Skrypt powłoki
running
Miałem skrypt powłoki, który sprawdza, czy program działa, a teraz dodałem opcję
-s
uruchomienia gosudo strace -f -p <PID>
(zgodnie z odpowiedzią Sergiy Kolodyazhnyy) po znalezieniu ...Używa skryptu
ps -ef
znaleźć większość programówsystemctl is-active --quiet
znaleźć jakieś programya jeśli chcesz
strace
wxterm
oknie.Zainstaluj,
xterm
jeśli chcesz użyćstrace
do oglądania aktywności programu.Stosowanie
Możesz zainstalować skrypt shellscript
running
w katalogu,PATH
jeśli chcesz mieć do niego łatwy dostęp.Kod shellscript
Próbny
Sprawdzanie okien terminali w Lubuntu (LXTerminal uruchomił się jako
x-terminal-emulator
i niestandardowegnome-terminal
okna),Gdy kursor znajdzie się w oknie terminala, jest dużo aktywności.
Uruchamianie
grep
(oczekiwanie na dane wejściowe z/dev/stdin
)Sprawdzam to
Aktywność jest niewielka i możesz zidentyfikować, co się dzieje.
źródło
iotop
, chociaż użycie procesora niekoniecznie musi być wskaźnikiem, jeśli proces jest zajęty. Program napisany w C i zoptymalizowany może używać minimalnego procesora. Niektóre wskaźniki, które napisałem w Pythonie, planują uruchomienie powtarzanego zadania, więc może użyć CPU do aktualizacji menu wskaźników na chwilę, a następnie po prostu tam siedzi.strace
Metoda jest lepsza, ale może nie jest konieczne lub nie jest dostępna.Nie jestem pewien, czy nadal tego potrzebujesz, ale wciąż przydatna sztuczka: jeśli program wydaje się wychodzić bez żadnego wyjścia, możesz sprawdzić, czy działa w tle, wykonując
Twoje zdrowie!
źródło
Jeśli uruchamiasz powłokę w terminalu, na przykład emulatorze terminala lub typowej sesji ssh, powłoka prawie na pewno włączyła kontrolę zadań. To sprawia, że w większości przypadków uzyskanie odpowiedzi na twoje pytanie jest bardzo łatwe.
Wpisz, Ctrl+Zaby zawiesić proces, a następnie
bg
kontynuować w tle, a następnie wpisz pustą linię do powłoki, aby sprawdzić, czy program został zatrzymany przez sygnał.Jeśli proces próbuje odczytać z terminala, natychmiast otrzyma
SIGTTIN
sygnał i zostanie zawieszony. (Gdy kontrola zadań jest włączona, system zezwala tylko na jeden proces do odczytu z terminala). Powłoka to zgłosi. Następnie możesz wpisać,fg
aby kontynuować proces na pierwszym planie, a następnie wpisać dane wejściowe do odczytania przez program w normalny sposób.Niektóre programy, takie jak edytory, wychwytują lub ignorują sygnał generowany przez Ctrl+Zlub wprowadzają terminal w tryb, w którym znaki sterujące nawet nie generują sygnałów. Trzeba korzystać z bardziej zaawansowanych technik, w tym przypadku, takie jak wykorzystanie
strace
aby sprawdzić, czy proces robiread
,select
,poll
, itd.źródło