W systemie Linux polecenie ps aux wyświetla listę procesów z wieloma kolumnami dla każdej statystyki. na przykładDzielenie wyjścia ps za pomocą Pythona
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
...
postfix 22611 0.0 0.2 54136 2544 ? S 15:26 0:00 pickup -l -t fifo -u
apache 22920 0.0 1.5 198340 16588 ? S 09:58 0:05 /usr/sbin/httpd
Chcę być w stanie odczytać to w Pythonie i podzielić się każdy wiersz, a następnie każdą kolumnę, więc mogą być używane jako wartości.
W przeważającej części, to nie jest problem:
ps = subprocess.Popen(['ps', 'aux'], stdout=subprocess.PIPE).communicate()[0]
processes = ps.split('\n')
mogę teraz pętli procesów, aby każdy wiersz i podzielić ją przez przestrzenie, na przykład
sep = re.compile('[\s]+')
for row in processes:
print sep.split(row)
jednak Problem polega na tym, że ostatnia kolumna, polecenie, czasami ma spacje. W powyższym przykładzie widać to w komendzie
pickup -l -t fifo -u
które byłyby wydzielone jako
['postfix', '22611', '0.0', '0.2', '54136', '2544', '?', 'S', '15:26', '0:00', 'pickup', '-l', '-t', 'fifo', '-u']
ale naprawdę chcę ją jako:
['postfix', '22611', '0.0', '0.2', '54136', '2544', '?', 'S', '15:26', '0:00', 'pickup -l -t fifo -u']
Więc moje pytanie brzmi: w jaki sposób mogę podzielić się kolumny, ale gdy przychodzi do kolumny poleceń, zachować cały łańcuch jako jeden element listy, a nie podzielić go spacjami?
nie rób tego. Wyjście ps jest ** NIE ** przeznaczone do odczytu maszynowego. Albo wykopuj te informacje w systemie plików/proc, albo użyj PSI, jak sugeruje vartec. – Juliano
Dlaczego nie powinno być możliwe do odczytu maszynowego? – DavidM
David, myślę, że Juliano oznacza po prostu, że wynik PS różni się tak bardzo (jak zauważyłeś, ciąg poleceń jest podzielony na wiele części przez twoje wyrażenie regularne i nie ma możliwości, aby program wiedział o tym niepożądanym), że byłoby łatwiej użyć/proc fs lub PSI. To nie jest to, że to NIE MASZYNA CZYTELNA * to jest ból. – sholsapp