2009-02-06 14 views
9

Trong Perl, tôi cần đọc môi trường của các quy trình khác.Có cách nào để đọc các biến môi trường của các quá trình khác bằng Perl và trong môi trường Linux hoặc Solaris không?

  • Tập lệnh đang chạy với quyền root .
  • Tập lệnh sẽ là chạy trong cả Linux và Solaris.
  • Tôi muốn một giải pháp chủ yếu là nền tảng bất khả tri, ít nhất là giữa Linux và Solaris. Trong Linux, kiểm tra/env/< proc_id>/environ có thể cho tôi câu trả lời.
  • Tôi muốn tránh phải ngã ba. Tôi đã có một giải pháp forking "/ usr/ucb/ps -auxwwwe $ pid"

Bất kỳ ý tưởng nào?

Trả lời

7

Đối với Solaris, bạn có thể thử procfs module from CPAN. Mặc dù mô-đun này dường như vẫn còn khá trẻ, câu nói này nghe có vẻ hy vọng:

Brian Farrell đã gửi một bản vá rất hữu ích mà xử lý kiểm tra argv và môi trường của các quá trình khác với quy trình hiện đang chạy.

Tôi tưởng tượng rằng đây có lẽ chỉ là môi trường ban đầu (giống như tệp environ dưới Linux), nhưng dường như đó là những gì bạn muốn?

Nếu không, mặc dù tôi thấy bạn nói rằng bạn không muốn ngã ba, một giải pháp đơn giản có thể sẽ quay ~ 20 dòng C để tạo ra một chương trình nhỏ chỉ kích thích môi trường trên Solaris. Linux environ tệp. Tôi đã có một cái gì đó rất giống trong C rồi. Nếu bạn quan tâm, tôi có thể đăng nó.

EDIT (sau khi đọc OpenSolaris pargs.c): Bộ đệm môi trường được phân bổ lại dưới Solaris khi môi trường thay đổi, do đó con trỏ psinfo có thể không hợp lệ. Đối với một giải pháp chống đạn, bạn cần phải truy tìm _environ. Đó là tất cả có thể rắc rối hơn bạn cần ... pargs -e <pid> có thể là một thay đổi đẹp hơn cho UCB ps(1) nếu bạn đi tuyến đường ngã ba, mặc dù.

+1

phải rõ ràng: pargs -e là cách để đi (bọc này bên trong một cuộc gọi hệ thống perl) – PaulS

12

Trong linux có vẻ như /proc/<pid>/environ psuedofiles chứa biến môi trường được chuyển khi quá trình được tạo. Nếu bạn có đủ quyền, bạn có thể đọc chúng.

Chúng dường như không theo dõi các thay đổi trong môi trường quy trình sau khi khởi chạy.

Điều đó cho thấy rằng bạn sẽ phải phân biệt kết xuất bộ nhớ của quy trình để nhận được những gì bạn đang yêu cầu.

Tricky.

+0

Heh. Có vẻ như tôi đã không thực sự đọc câu hỏi của anh ấy. Lấy làm tiếc. – dmckee

+0

Hệ thống tập tin Solaris/proc (Solaris 10) dường như không bao gồm cả môi trường gốc. –

+0

@ Jonathan, hãy xem tệp/proc/pid/psinfo và xem struct psinfo từ . Trường pr_envp là môi trường ban đầu. –

5

Điều đầu tiên xuất hiện trong đầu tôi là sử dụng GDB để đính kèm vào quy trình được đề cập và sau đó yêu cầu GDB nhận môi trường cho bạn. Bạn có thể thực hiện điều này bằng lệnh "hiển thị môi trường" trong vỏ GDB .

Có vẻ như có mô-đun Perl có thể thực hiện việc này cho bạn, Devel::GDB. Tôi chưa thử , nhưng có vẻ như một Vấn đề Lập trình Đơn giản để tạo đối tượng Devel :: GDB, kết nối với quy trình bạn muốn kiểm tra, gửi lệnh "hiển thị môi trường" rồi phân tích cú pháp các kết quả.

Tôi phải nói mặc dù ... khi giải pháp này phức tạp, bạn có thể đang làm điều gì khác sai. Tại sao bạn cần môi trường cho một quá trình ngẫu nhiên?

+0

Trích: Tại sao bạn cần môi trường cho một quá trình ngẫu nhiên? Đây là một phần của tập lệnh tập hợp thông tin về các quy trình đang chạy trên hệ thống. Dữ liệu được lưu để được phân tích sau này. –

+0

hiển thị môi trường cho thấy môi trường của gdb, không phải là quá trình nó được gắn vào. Từ hướng dẫn gdb: "In giá trị của biến môi trường varname để được cung cấp cho chương trình của bạn khi nó bắt đầu." Nói cách khác, hiển thị môi trường là hữu ích nếu bạn đang có kế hoạch khởi chạy một chương trình, nhưng nó không hữu ích để cho bạn biết về môi trường của một chương trình mà bạn đính kèm. Đúng nếu tôi sai, nhưng các bài kiểm tra và đọc hướng dẫn sử dụng của tôi cho thấy câu trả lời này là hoàn toàn không chính xác. –

2

Nếu ps có thể làm điều đó, như bạn nói, thì câu trả lời của bạn có thể được tìm thấy ở đâu đó trong mã nguồn của ps. Điều đó sẽ tránh sinh sản của một quá trình mới.

8

Gói 'binutils' của GNU bao gồm tiện ích CLI có tên là strings. Xem http://www.gnu.org/software/binutils/ để biết thêm thông tin.

strings /proc/pid/environ - in ra một danh sách đẹp các biến môi trường giống như env.

+1

Tôi cũng đến đây tìm kiếm một câu trả lời cụ thể không phải là perl Linux. '/ proc/$$/environ' là danh sách các chuỗi' KEY = value' được phân tách bằng null (tôi phát hiện ra bằng cách yêu cầu 'xxd/proc/$$/environ' nhưng có lẽ nó được ghi lại ở đâu đó). Bạn có thể biến nó thành một thứ dễ đọc hơn chỉ với các công cụ POSIX chuẩn. Chỉ cần sử dụng 'cat/proc/$$/environ | tr '\ 0' '\ n''. – alsuren

+0

@alsuren Cảm ơn. Điều đó hoạt động. Cả hai xxd và việc sử dụng tr để sửa chữa đầu ra khá hữu ích. –

0

Trên Linux, có thể đủ để giải quyết liên kết tượng trưng /proc/[pid]/cwd, xem procfs(5).