2009-02-19 26 views
58

Tôi có thể thay đổi tên quy trình hiệu quả của tập lệnh Python không? Tôi muốn hiển thị một tên khác thay vì tên thật của quá trình khi tôi nhận được danh sách quy trình hệ thống. Trong C tôi có thể thiếtCó cách nào để thay đổi tên quy trình hiệu quả bằng Python không?

strcpy(argv[0],"othername"); 

Nhưng trong Python

argv[0] = "othername" 

dường như không làm việc. Khi tôi nhận được danh sách quá trình (với ps ax trong hộp linux của tôi) tên thật không thay đổi. Tôi thích một giải pháp di động (hoặc một giải pháp khác cho posix và một giải pháp cho môi trường windows), nếu nó tồn tại.

Cảm ơn trước

+0

xem thêm https://superuser.com/questions/427642/is-it-possible-to-set-the-process-name-with-pythonw, trong đó http: // bugs.python.org/issue5672 là tôi ntionned – anarcat

Trả lời

10

Đơn giản chỉ cần đặt, không có cách di động. Bạn sẽ phải kiểm tra hệ thống và sử dụng phương thức ưu tiên cho hệ thống đó.

Hơn nữa, tôi nhầm lẫn về ý nghĩa của các tên quy trình trên Windows.

Bạn có phải là tên dịch vụ không? Tôi đoán như vậy, bởi vì không có gì khác thực sự làm cho bất kỳ ý nghĩa (ít nhất là không sử dụng Windows của tôi).

Nếu có, bạn cần sử dụng Tim Golden's WMI interface và gọi phương thức .Change trên dịch vụ ... ít nhất theo số tutorial của mình.

Đối với Linux, không có phương pháp nào tôi tìm thấy đã làm việc ngoại trừ this poorly packaged module đặt argv [0] cho bạn.

Tôi thậm chí không biết nếu điều này sẽ làm việc trên các biến thể BSD (mà không có một cuộc gọi hệ thống setproctitle). Tôi khá chắc chắn argv [0] sẽ không hoạt động trên Solaris.

+0

Tôi biết đã muộn, nhưng đối với những độc giả mới, hãy xem xét @MattWritesCode [answer] (http://stackoverflow.com/a/13267122/248390), nhanh chóng và đơn giản cho CPython trên Linux. – bufh

-8
In [1]: import sys 

In [2]: print sys.argv[0] 
C:\Python25\scripts\ipython.py 

In [3]: sys.argv[0] = 'foo' 

In [4]: print sys.argv[0] 
foo 

Note đĩa đơn '=' đăng

+2

Nhưng nếu tôi chạy ps (danh sách quá trình trong hộp linux) tên quá trình vẫn chính xác như nhau. Hãy thử – Emilio

+1

vì vậy, thay vì downvoting câu trả lời của tôi - hãy cố gắng làm rõ điểm này trong câu hỏi của bạn. ... –

+2

Điều này không thay đổi tên quy trình. Nó chỉ thay đổi bản sao của argv của Python. Tôi khuyên bạn nên xóa câu trả lời rõ ràng này sai. – Dakkaron

4

Thứ nhất, tôi không chắc chắn mà chỉ đơn giản cài đặt argv[0] trong một chương trình C portably thay đổi tên hiển thị trong ps. Có lẽ nó có trong một số unixen, nhưng sự hiểu biết của tôi là nó không dự kiến.

Thứ hai, vì Windows tuân thủ đặc biệt không tuân thủ POSIX, chỉ một vài điều "di động" giữa POSIX và không POSIX. Vì bạn đặc biệt nói 'ps', tôi cho rằng POSIX là ưu tiên của bạn và Windows có thể không hoạt động.

Quan trọng hơn, sự hiểu biết của tôi về việc thay đổi argv[0] là yêu cầu gọi đến số exec để thực hiện các thay đổi này. Cụ thể, cuộc gọi exec có cả đường dẫn đến tệp thực thi và danh sách argv riêng biệt. Thực hiện cuộc gọi của riêng bạn cho phép bạn phá vỡ quy ước vỏ đặt tên thực thi trong argv[0].

Bạn có OS library process management cho phép bạn truy cập trực tiếp vào thư viện OS để thực hiện việc này. Bạn nên xem xét việc phá vỡ kịch bản của bạn thành hai phần - một khởi động và "công việc thực sự". Bộ khởi động thiết lập môi trường thời gian chạy và thực thi công việc thực với các tham số mong muốn.

Trong C, bạn đang thay thế quy trình của riêng mình bằng quy trình khác. Trong Python, bạn đang thay thế trình thông dịch Python cũ bằng một trình thông dịch mới có một argv khác [0]. Hy vọng rằng, nó sẽ không balk lúc này. Một số chương trình kiểm tra argv [0] để quyết định xem họ đang làm gì.

Bạn cũng có subprocess.popen mà bạn có thể sử dụng để đặt các arg và thực thi mong muốn của mình. Tuy nhiên, trong trường hợp này, quy trình phụ huynh nên nán lại để thu thập đứa trẻ khi đứa trẻ kết thúc. Cha mẹ có thể không làm bất cứ điều gì nhiều hơn một số Popen.wait

+1

Không, thay đổi argv trong Linux (và có thể là các Unix khác, nhưng không phải tất cả) thay đổi ngay tên quy trình có thể nhìn thấy, được sử dụng bởi nhiều chương trình được sử dụng rộng rãi để cung cấp tên mô tả cho các quá trình của chúng: cả ssh và postgres một số chủ động thay đổi tên của họ trên bay để cho biết tình trạng hiện tại của họ. Một mô-đun Python có thể được viết để thực hiện việc này, sử dụng lệnh gọi Py_GetArgcArgv API. –

45

thực sự bạn cần 2 thứ trên linux: sửa đổi argv[0] từ C (ví ps auxf và bạn bè) và gọi prctl với PR_SET_NAME cờ.

Hoàn toàn không có cách nào để thực hiện đoạn đầu tiên từ chính python. Mặc dù, bạn chỉ có thể thay đổi tên quy trình bằng cách gọi prctl.

def set_proc_name(newname): 
    from ctypes import cdll, byref, create_string_buffer 
    libc = cdll.LoadLibrary('libc.so.6') 
    buff = create_string_buffer(len(newname)+1) 
    buff.value = newname 
    libc.prctl(15, byref(buff), 0, 0, 0) 

def get_proc_name(): 
    from ctypes import cdll, byref, create_string_buffer 
    libc = cdll.LoadLibrary('libc.so.6') 
    buff = create_string_buffer(128) 
    # 16 == PR_GET_NAME from <linux/prctl.h> 
    libc.prctl(16, byref(buff), 0, 0, 0) 
    return buff.value 

import sys 
# sys.argv[0] == 'python' 

# outputs 'python' 
get_proc_name() 

set_proc_name('testing yeah') 

# outputs 'testing yeah' 
get_proc_name() 

ps auxf sẽ hiển thị chỉ 'trăn' sau đó :(. Nhưng topps -A sẽ hiển thị mới 'thử nghiệm vâng' tên quá trình :). Ngoài ra killallpkill sẽ hoạt động với tên mới.

btw, tên mua từ googlecode cũng thay đổi argv[0], do đó, ngay cả, thay đổi đầu ra ps auxf.

CẬP NHẬT: Giải pháp được đăng trong câu trả lời này không phát đẹp đôi khi trên FreeBSD. Tôi hiện đang sử dụng py-setproctitle đã nêu in this answer trong một năm hoặc hơn trên các hộp linux và freebsd khác nhau. Không thất bại cho đến nay! Mọi người cũng nên thế! :). Nó sử dụng hầu hết mã giống như PostgreSQLuses trong cơ sở dữ liệu và quy trình con chính của nó.

+0

procname không hoạt động trên PyPy (chỉ trên CPython) phải sử dụng setproctitle. – radtek

67

tôi vừa mới viết một mô-đun Python để thay đổi tên chương trình xuất một cách cầm tay: kiểm tra https://github.com/dvarrazzo/py-setproctitle

Nó là một wrapper xung quanh mã được sử dụng bởi PostgreSQL để thực hiện các thay đổi tiêu đề. Nó hiện đang được thử nghiệm chống lại Linux và Mac OS X: Windows (với chức năng giới hạn) và các cổng BSD đang trên đường.

Chỉnh sửa: kể từ tháng 7 năm 2010, mô-đun hoạt động với BSD và có chức năng giới hạn trên Windows và đã được chuyển sang Python 3.x.

+0

Không thể cài đặt trên cửa sổ. – user

+0

@user không bao giờ bận tâm: nó không phải là rất hữu ích trên Windows nhưng không có nhiều để làm về nó. – piro

+0

Có cách nào để thay đổi các đối số được hiển thị bởi ps -f không? Tôi không thực sự quan tâm đến tên chương trình (luôn là python), nhưng tôi muốn thay đổi các đối số được hiển thị. – KillianDS

5

Có một cái nhìn về setproctitle gói

Đây là một phiên bản khá cầm tay và hoạt động trên nhiều nền tảng.

0

Tôi đã tìm thấy python-prctl hoạt động rất tốt trong Linux. Bạn sẽ phải tìm một cái gì đó khác cho Windows.

2

câu trả lời của tôi cho câu hỏi tương tự như đánh dấu là duplicate:

Có đơn giản hơn (bạn không cần phải nhập khẩu bất kỳ libs) nhưng cách có lẽ không tao nhã như vậy. Bạn không được sử dụng "env" bên trong dòng shebang.

Nói cách khác, điều này sẽ được đặt tên là "trăn" trong danh sách quá trình:

#!/usr/bin/env python 

Nhưng điều này sẽ được đặt tên với Tập lệnh của bạn:

#!/usr/bin/python 

Vì vậy, bạn sẽ có thể tìm thấy nó với một cái gì đó như pidof -x scriptname hoặc ps -C scriptname

Các vấn đề liên quan