Here are the different values that the s, stat and state output
specifiers (header "STAT" or "S") will display to describe the state of
a process....+ is in the foreground process group
Abyś mógł wykonać proste sprawdzenie:
case $(ps -o stat=-p $$)in*+*) echo "Running in foreground";;*) echo "Running in background";;esac
Wszystkie poprzednie rozwiązania obejmują procesy odradzania itp. Bardzo, bardzo brzydkie, ponieważ .bashrcsą wywoływane za każdym razem, gdy uruchamiana jest powłoka bash, stąd te rozwiązania kończą uruchamianie tysiąca procesów.
Znacznie czystsze jest pytanie samego basha: bash ma predefiniowaną zmienną, $-która ma „i”, jeśli działa w interaktywnej powłoce. Na przykład umieszczenie tego w pliku .bashrc jest znacznie czystsze i znacznie tańsze, a co najważniejsze, zawsze będzie działać!
CZEMU KRZYCZYSZ? To wygląda bardzo, bardzo brzydko ...
Pierre.Vriens,
Proste, prawidłowe rozwiązanie.
Ed Randall
0
Choć można by pomyśleć, że sprawdzenie, czy powłoka jest uruchomiona w trybie interaktywnym, da ten sam rezultat, w praktyce tak nie jest. Koncepcja wygląda podobnie, ale w rzeczywistości jest inna. Możesz uruchomić interaktywny skrypt w danych wejściowych do karmienia w tle, dzięki oczekiwaniu . Możesz także uruchomić skrypt za pomocą bash z -largumentem. Nie możemy zatem polegać na interaktywności bash, aby sprawdzić, czy nasz skrypt jest uruchamiany w tle, czy na pierwszym planie.
Odpowiedzi:
Cytowanie
man ps
:KODY PAŃSTWA PROCESU
Abyś mógł wykonać proste sprawdzenie:
źródło
Spójrz na plik /etc/bash.bashrc ".
Linia, która ma „$ PS1”. Następnie wykonaj „man bash” i poszukaj tokena PS1.
wychodzi ze skryptu, który nie jest interaktywny.
źródło
Wszystkie poprzednie rozwiązania obejmują procesy odradzania itp. Bardzo, bardzo brzydkie, ponieważ
.bashrc
są wywoływane za każdym razem, gdy uruchamiana jest powłoka bash, stąd te rozwiązania kończą uruchamianie tysiąca procesów.Znacznie czystsze jest pytanie samego basha: bash ma predefiniowaną zmienną,
$-
która ma „i”, jeśli działa w interaktywnej powłoce. Na przykład umieszczenie tego w pliku .bashrc jest znacznie czystsze i znacznie tańsze, a co najważniejsze, zawsze będzie działać!źródło
Choć można by pomyśleć, że sprawdzenie, czy powłoka jest uruchomiona w trybie interaktywnym, da ten sam rezultat, w praktyce tak nie jest. Koncepcja wygląda podobnie, ale w rzeczywistości jest inna. Możesz uruchomić interaktywny skrypt w danych wejściowych do karmienia w tle, dzięki oczekiwaniu . Możesz także uruchomić skrypt za pomocą bash z
-l
argumentem. Nie możemy zatem polegać na interaktywności bash, aby sprawdzić, czy nasz skrypt jest uruchamiany w tle, czy na pierwszym planie.Odpowiedź devnull jest zatem poprawna . Aby ustalić, czy proces działa na pierwszym planie, narzędzie ps sprawdza, czy grupa procesów (pgrp) jest taka sama jak identyfikator grupy procesów powiązany z terminalem sterującym sesji (tpgid) i dodaje
+
znak w danych wyjściowych zgodnie z procesem stan.Wiedząc o tym, zdecydowanie możemy mieć wersję testową opartą wyłącznie na bashu:
W powyższym kodzie wyświetlamy wynik w pliku tekstowym, ponieważ
stdout
nie jest on połączony, gdy proces jest uruchomiony w tle.Zwróć uwagę, że czwarty i ósmy element tabeli odpowiadają odpowiednio
pgrp
itpgid
( patrz sekcja / proc / [pid] / stat na stronie podręcznika -man 5 proc
).źródło