Trên Linux, lệnh ps aux xuất ra một danh sách các quy trình có nhiều cột cho mỗi chỉ số. ví dụ.Tách đầu ra của ps bằng cách sử dụng Python
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
Tôi muốn có thể đọc điều này bằng cách sử dụng Python và tách từng hàng và sau đó mỗi cột để chúng có thể được sử dụng làm giá trị.
Đối với hầu hết các phần, đây không phải là một vấn đề:
ps = subprocess.Popen(['ps', 'aux'], stdout=subprocess.PIPE).communicate()[0]
processes = ps.split('\n')
bây giờ tôi có thể lặp qua các quy trình để có được mỗi hàng và chia nó ra bằng dấu cách, ví dụ
sep = re.compile('[\s]+')
for row in processes:
print sep.split(row)
Tuy nhiên, vấn đề là cột cuối cùng, lệnh, đôi khi có dấu cách. Trong ví dụ trên, bạn có thể thấy trong lệnh
pickup -l -t fifo -u
mà sẽ được chia ra như
['postfix', '22611', '0.0', '0.2', '54136', '2544', '?', 'S', '15:26', '0:00', 'pickup', '-l', '-t', 'fifo', '-u']
nhưng tôi thực sự muốn nó như:
['postfix', '22611', '0.0', '0.2', '54136', '2544', '?', 'S', '15:26', '0:00', 'pickup -l -t fifo -u']
Vì vậy, câu hỏi của tôi là, làm thế nào tôi có thể chia ra các cột nhưng khi nói đến cột lệnh, giữ toàn bộ chuỗi như một phần tử danh sách chứ không phải chia nhỏ theo không gian?
Đừng làm điều đó. đầu ra ps là ** NOT ** được thiết kế để có thể đọc được trên máy. Hoặc khai thác thông tin này trên hệ thống tập tin/proc, hoặc sử dụng PSI, như đề xuất của vartec. – Juliano
Tại sao nó không phải là máy có thể đọc được? – DavidM
David, tôi nghĩ Juliano đơn giản muốn nói rằng đầu ra PS thay đổi rất nhiều (như bạn đã chỉ ra, chuỗi lệnh được chia thành nhiều phần bởi regex của bạn và không có cách nào để chương trình biết điều này không mong muốn) sẽ dễ dàng hơn cho bạn khi sử dụng/proc fs hoặc PSI. Nó không phải là nó * KHÔNG MÁY READABLE * nó là nó sẽ là một nỗi đau để làm. – sholsapp