Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/site-packages/absl/command_name.py: 19%
26 statements
« prev ^ index » next coverage.py v7.4.0, created at 2024-01-03 07:57 +0000
« prev ^ index » next coverage.py v7.4.0, created at 2024-01-03 07:57 +0000
1# Copyright 2017 The Abseil Authors.
2#
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7# http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
15"""A tiny stand alone library to change the kernel process name on Linux."""
17import os
18import sys
20# This library must be kept small and stand alone. It is used by small things
21# that require no extension modules.
24def make_process_name_useful():
25 """Sets the process name to something better than 'python' if possible."""
26 set_kernel_process_name(os.path.basename(sys.argv[0]))
29def set_kernel_process_name(name):
30 """Changes the Kernel's /proc/self/status process name on Linux.
32 The kernel name is NOT what will be shown by the ps or top command.
33 It is a 15 character string stored in the kernel's process table that
34 is included in the kernel log when a process is OOM killed.
35 The first 15 bytes of name are used. Non-ASCII unicode is replaced with '?'.
37 Does nothing if /proc/self/comm cannot be written or prctl() fails.
39 Args:
40 name: bytes|unicode, the Linux kernel's command name to set.
41 """
42 if not isinstance(name, bytes):
43 name = name.encode('ascii', 'replace')
44 try:
45 # This is preferred to using ctypes to try and call prctl() when possible.
46 with open('/proc/self/comm', 'wb') as proc_comm:
47 proc_comm.write(name[:15])
48 except EnvironmentError:
49 try:
50 import ctypes # pylint: disable=g-import-not-at-top
51 except ImportError:
52 return # No ctypes.
53 try:
54 libc = ctypes.CDLL('libc.so.6')
55 except EnvironmentError:
56 return # No libc.so.6.
57 pr_set_name = ctypes.c_ulong(15) # linux/prctl.h PR_SET_NAME value.
58 zero = ctypes.c_ulong(0)
59 try:
60 libc.prctl(pr_set_name, name, zero, zero, zero)
61 # Ignore the prctl return value. Nothing we can do if it errored.
62 except AttributeError:
63 return # No prctl.