|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
"""A tiny stand alone library to change the kernel process name on Linux.""" |
|
|
|
import os |
|
import sys |
|
|
|
|
|
|
|
|
|
|
|
def make_process_name_useful(): |
|
"""Sets the process name to something better than 'python' if possible.""" |
|
set_kernel_process_name(os.path.basename(sys.argv[0])) |
|
|
|
|
|
def set_kernel_process_name(name): |
|
"""Changes the Kernel's /proc/self/status process name on Linux. |
|
|
|
The kernel name is NOT what will be shown by the ps or top command. |
|
It is a 15 character string stored in the kernel's process table that |
|
is included in the kernel log when a process is OOM killed. |
|
The first 15 bytes of name are used. Non-ASCII unicode is replaced with '?'. |
|
|
|
Does nothing if /proc/self/comm cannot be written or prctl() fails. |
|
|
|
Args: |
|
name: bytes|unicode, the Linux kernel's command name to set. |
|
""" |
|
if not isinstance(name, bytes): |
|
name = name.encode('ascii', 'replace') |
|
try: |
|
|
|
with open('/proc/self/comm', 'wb') as proc_comm: |
|
proc_comm.write(name[:15]) |
|
except EnvironmentError: |
|
try: |
|
import ctypes |
|
except ImportError: |
|
return |
|
try: |
|
libc = ctypes.CDLL('libc.so.6') |
|
except EnvironmentError: |
|
return |
|
pr_set_name = ctypes.c_ulong(15) |
|
zero = ctypes.c_ulong(0) |
|
try: |
|
libc.prctl(pr_set_name, name, zero, zero, zero) |
|
|
|
except AttributeError: |
|
return |
|
|