64 lines
2.2 KiB
Python
64 lines
2.2 KiB
Python
|
# Copyright 2017 The Abseil Authors.
|
||
|
#
|
||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
# you may not use this file except in compliance with the License.
|
||
|
# You may obtain a copy of the License at
|
||
|
#
|
||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||
|
#
|
||
|
# Unless required by applicable law or agreed to in writing, software
|
||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
# See the License for the specific language governing permissions and
|
||
|
# limitations under the License.
|
||
|
|
||
|
"""A tiny stand alone library to change the kernel process name on Linux."""
|
||
|
|
||
|
import os
|
||
|
import sys
|
||
|
|
||
|
# This library must be kept small and stand alone. It is used by small things
|
||
|
# that require no extension modules.
|
||
|
|
||
|
|
||
|
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:
|
||
|
# This is preferred to using ctypes to try and call prctl() when possible.
|
||
|
with open('/proc/self/comm', 'wb') as proc_comm:
|
||
|
proc_comm.write(name[:15])
|
||
|
except EnvironmentError:
|
||
|
try:
|
||
|
import ctypes
|
||
|
except ImportError:
|
||
|
return # No ctypes.
|
||
|
try:
|
||
|
libc = ctypes.CDLL('libc.so.6')
|
||
|
except EnvironmentError:
|
||
|
return # No libc.so.6.
|
||
|
pr_set_name = ctypes.c_ulong(15) # linux/prctl.h PR_SET_NAME value.
|
||
|
zero = ctypes.c_ulong(0)
|
||
|
try:
|
||
|
libc.prctl(pr_set_name, name, zero, zero, zero)
|
||
|
# Ignore the prctl return value. Nothing we can do if it errored.
|
||
|
except AttributeError:
|
||
|
return # No prctl.
|