Jak sprawdzić, które polecenie jest wykonywane bez jego zatrzymywania?

20

W moim przykładzie uruchamiam polecenie, które zajmuje bardzo dużo czasu (kilka godzin).

Naprawdę nie pamiętam, czy wpisałem make lub make -j4.

Oczywiście mógłbym to zatrzymać i nacisnąć klawisz w górę lub sprawdzić historię, aby to wiedzieć, ale to by zatrzymało proces i nie chcę, aby tak się stało (w przypadku, gdy już robi make -j4).

Czy jest jakiś sposób, aby dowiedzieć się, które polecenie jest wykonywane bez zatrzymywania procesu?

Daniel Viaño
źródło
5
Z innego terminalu spróbujpgrep -a make
John1024
2
W przypadku makemożesz go zatrzymać i uruchomić ponownie, a powinien on zacząć od miejsca, w którym zakończył.
user253751,

Odpowiedzi:

34

Jeśli chcesz zobaczyć pełny wiersz poleceń dla każdej instancji makeuruchomionej na twoim komputerze, otwórz nowy terminal i spróbuj:

pgrep -a make

pgrepto program, który przeszukuje wszystkie procesy na twoim komputerze. W tym przypadku szuka programów o nazwie make. Opcja -amówi pgrepdo listy zarówno identyfikator procesu i linii poleceń pełną dla każdego procesu dopasowywania. (Bez zwróciłoby -ato tylko identyfikator procesu.) Aby uzyskać więcej informacji na temat wielu opcji pgrep, zobacz man pgrep.

John1024
źródło
7
Jest to przydatne w prostych przypadkach, takich jak ten w pytaniu. Jednak jeśli polecenie dotyczy potoków, pętli, sekwencji poleceń, poleceń wewnętrznych lub rozszerzenia zmiennych, to, co można znaleźć pgrep, wyglądałoby inaczej niż polecenie wpisane w wierszu poleceń.
kasperd,
28

Gdy okno terminala jest aktywne, możesz wstrzymać (zawiesić) proces, naciskając Ctrl+ Z. Następnie możesz przesunąć zadanie w tle, wpisując bg(Twoje zadanie będzie teraz kontynuowane w tle, a jednocześnie możesz pracować w wierszu polecenia; jest to równoważne z uruchomieniem zadania &na końcu wiersza polecenia). Następnie użyj strzałek kursora (w górę i w dół), aby zobaczyć, którego polecenia użyłeś. Jeśli chcesz (ale nie jest to konieczne), możesz przenieść swoją pracę na pierwszy plan, pisząc fg.

Stefan
źródło
7
Działa to z niektórymi poleceniami, ale nie ze wszystkimi. Na przykład, jeśli wpiszesz taką pętlę, for X in {1..1000} ; do sleep $X ; donewówczas pętla zostanie przerwana, a pozostałe iteracje nie wystąpią.
kasperd,
11
@kasperd Tak, dość denerwujące, jeśli mnie zapytasz, ale odkryłem fajne obejście tego problemu. Otocz skomplikowane polecenie w nawiasie, aby było to podpowłoka. Następnie Ctrl-Z zawiesi całą podpowłokę i wznowi poprawnie.
penguin359,
@kasperd Nie w bash, ale robią w Zsh.
JoL
4
Nie trzeba umieszczać zadania w tle: wystarczy go zawiesić, sprawdzić historię (lub jobs, jak pokazano w odpowiedzi @ ichabod), a następnie wznowić fg.
Konrad Rudolph,
10

Robię coś takiego jak Stefan: ^ Z, aby wstrzymać pracę, a potem biegnę jobs. Jeśli masz uruchomionych wiele procesów, być może będziesz musiał ustalić, które zadanie było tym, które zostało wstrzymane, ale ogólnie spowoduje to wyświetlenie wiersza polecenia. Następnie uruchom, fgaby kontynuować wykonywanie.

ichabod
źródło
1

Dobrym sposobem na zobaczenie tego dynamicznie jest uruchomienie na górze, a to pokazuje ogólny stan systemu i uruchomione procesy w systemie.

Wykonanie 'ps ux' pokazuje twoje procesy wraz z pid i innymi informacjami, możesz użyć umiejętności, aby zabić niektóre z nich, jeśli chcesz, strona podręcznika jest dobrym zasobem, a wykonanie umiejętności lub zabicie -9 powoduje, że procesy są lepkie zawieszone w urządzeniu czeka itp. Możesz również wysyłać inne sygnały do ​​procesów takich jak -hup, restartowane demony itp.

Góra jest ładna, ponieważ pokazuje rozmiar procesu, upływający czas, bieżące stany procesora oraz pamięć i zamianę.

Często robię $ make> & make.out &, a następnie mniej lub tail -f w pliku dziennika make.out. Od teraz make jest odłączany jako proces od mojej sesji powłoki.


źródło