Moja odpowiedź jest odmianą typowej odpowiedzi dotyczącej wyszukiwania „foobar” na ps
liście. Argument "-A" "ps"
jest bardziej przenośny niż "aux"
, jak sądzę, ale ta zmiana nie ma znaczenia dla odpowiedzi. Typowa odpowiedź wygląda następująco:
$ ps -A -ww | grep [f]oobar
Zamiast tego używam tego wzoru:
$ ps -A -ww | grep [^]]foobar
Główną zaletą jest to, że łatwiej jest pisać skrypty oparte na tych wzorcach, ponieważ po prostu łączy się ciąg statyczny [^]]
z dowolnym szukanym wzorcem. Nie musisz zdejmować pierwszej litery sznurka, a następnie wstawiać go między kwadratowe nawiasy klamrowe, a następnie ponownie łączyć je z powrotem. Podczas pisania skryptów w powłoce łatwiej jest po prostu trzymać [^]]
się wzoru, którego szukałeś. Przecinanie strun w Bash jest brzydką rzeczą, więc moja odmiana tego unika. Ta odmiana mówi, że pokaż linie, w których wzór pasuje BEZ wiodącego prawego nawiasu kwadratowego]. Ponieważ wzorzec wyszukiwania wykluczający nawias kwadratowy faktycznie dodaje nawias kwadratowy do wzorca, nigdy nie będzie pasował do siebie.
Możesz więc napisać przenośne psgrep
polecenie w następujący sposób. Tutaj uwzględniam różnice między Linuksem, OS X BSD i innymi. To dodaje nagłówki kolumn z ps
, zapewnia bardziej niestandardoweps
Format, który lepiej odpowiada moim potrzebom, wyświetla lepiej procesy i wyświetla listę wyjątkowo, bardzo szeroką, aby żaden z argumentów wiersza poleceń nie został pominięty. Cóż, większość nie jest pominięta. Java, która jest Javą, często robi wszystko w najgorszy możliwy sposób, więc niektóre usługi java będą działać po przekroczeniu maksymalnej dozwolonej długości argumentów, które śledzi tabela procesów. Myślę, że to 1024 znaki. Długość pojedynczego polecenia pozwalająca na uruchomienie procesu jest znacznie dłuższa, ale tabela procesów jądra nie zadaje sobie trudu, aby śledzić wszystko o długości przekraczającej 1 K. Po uruchomieniu polecenia nazwa-polecenia i lista argumentów nie są potrzebne, więc to, co jest przechowywane w tabeli procesów, ma jedynie charakter informacyjny.
psgrep ()
{
pattern=[^]]${1};
case "$(uname -s)" in
Darwin)
ps -A -ww -o pid,ppid,nice,pri,pcpu,pmem,etime,user,wchan,stat,command | grep -i -e "^[[:space:]]*PID" -e ${pattern}
;;
Linux)
ps -A -ww -o pid,ppid,tid,nice,pri,pcpu,pmem,etime,user,wchan:20,stat,command | grep -i -e "^[[:space:]]*PID" -e ${pattern}
;;
*) # other UNIX flavors get a minimalist version.
ps -A -ww | grep -i -e ${pattern}
;;
esac
}
grep --colour
.+1 za zwięzłą, zwięzłą odpowiedź, jednak OP może wymagać wyjaśnienia:
Za pomocą tego wyrażenia regularnego uruchamiasz proces, którego ciąg ps nie będzie pasował do siebie, ponieważ wyrażenie regularne pasuje,
"django"
a nie"[d]jango"
. W ten sposób wykluczysz proces zawierający ciąg „[d] jango”, którym w tym przypadku jest grep; To samo można zastosować do pgrep, egrep, awk, sed itp., Niezależnie od polecenia użytego do zdefiniowania wyrażenia regularnego.Od człowieka 7 wyrażenia regularnego
źródło
ps aux | grep [s]cript1
. Czy mógłbyś pomóc w komentowaniu rozwiązania?ps | grep [d]jango
ps | grep d[j]ango
...
ps | grep djang[o]
źródło
ps aux| grep "[Z] "
ps aux | grep [s]cript1
lubps aux | grep [s]cript2
. Linia grep jest nadal wyświetlana. Czy mógłbyś pomóc w komentowaniu rozwiązania?Zamiast tego użyj pgrep:
pgrep -lf django
źródło
pgrep
daje mi dokładnie ten problem. Ale muszę powiedzieć, że testuję to w CygWin (gdzieps
nie można wyświetlić pełnej linii poleceń procesu).pgrep
pasował do siebie. Okazuje się, że pasował do nazwybash
pliku skryptu, z którego go uruchomiłem. Dodanie-x
go naprawiło, a następnie dokładnie pasuje do nazwy polecenia.Och, czekaj, to działa:
źródło
grep
, na co nie można liczyć w ogólnym przypadku.ps -d | grep django
od człowieka ps:
źródło
ps
bycia notorycznie nieprzenośnymi, więc bez informacji o tym, dla której platformy to jest, ta odpowiedź nie jest bardzo pomocna. Co więcej, nie jest to oczywiście odpowiednie, gdy nie masz pewności, że proces, którego szukasz, nie jest liderem procesu (tzn. Może to pomóc, jeśli twoim celem jest demon, ale ogólnie nie inaczej).