U =_@@s@dZddlmZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddlmZddlmZddlmZddlmZdd lmZdd lmZdd lmZdd lmZdd lmZddlmZddlmZddlmZddlmZddlmZddlm Z ddlm!Z!ddlm"Z"ddlm#Z#ddlm$Z$ddlm%Z%ddlm&Z&ddlm'Z'ddlm(Z(ddlm)Z)ddl*m+Z+ddl*m,Z,ddl*m-Z-dd l*m.Z.dd!l*m/Z/dd"l*m0Z0e j1d#krddl2Z2ndZ2d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3gZ3d4Z4ej56d5e7Z8e9ed6Z:e9ed7Z;e<Z=e>d8Z?e@ZAdaBe0rhd9nd:ZCe jDd;kZEdeJe jGiZKeKjHZHe2dkrdZLdZMd?ZNd@ZOn GdAdBdBe2jIZPeQRePjSejTejUejVejWejXejYejZejZej[ej\ej]ej^dC Z_ej`ejaejbejcejdejeejfejgejhejiejjdD ZkedEdFdGdHdIdJdKdLdMdNdOdPg ZledQdRdSdTdUdVdWdXdYdZg Zmed[d\d]d^d_d`gZnedadbZoedceojpddZqeded\dfdgdhdidjdkdldmdndog ZredpdqdrserjpZtedsdRdSdTdUdtdugZuedvdwdxdydzd{gZvd|d}Zwd~dZxddZyeddZze=dfddZ{z ezdWn0e|k re }eddddda~YnXdZzddlmZWnBek rddlZejdddZe9edrdddZYnXedk re3ddeeDddZddZddZddZddZddZddZddZej56ds\ej56drfddZn ej56dr~ddZnddZejZGddde|ZGdddZeZdddZddZddZejZdddZdddZddZddZddZddZddZddÄZddńZddDŽZddɄZGdd˄de<ZdS)zLinux platform implementation.)divisionN) defaultdict) namedtuple)_common)_psposix) _psutil_linux) _psutil_posix) AccessDenied)debug)decode)get_procfs_path) isfile_strict)memoize)memoize_when_activated)NIC_DUPLEX_FULL)NIC_DUPLEX_HALF)NIC_DUPLEX_UNKNOWN) NoSuchProcess) open_binary) open_text)parse_environ_block)path_exists_strict) supports_ipv6) usage_percent) ZombieProcess)b) basestring)FileNotFoundError)PermissionError)ProcessLookupError)PY3)Z PROCFS_PATHIOPRIO_CLASS_NONEIOPRIO_CLASS_RTIOPRIO_CLASS_BEIOPRIO_CLASS_IDLECONN_ESTABLISHED CONN_SYN_SENT CONN_SYN_RECVCONN_FIN_WAIT1CONN_FIN_WAIT2CONN_TIME_WAIT CONN_CLOSECONN_CLOSE_WAIT CONN_LAST_ACK CONN_LISTEN CONN_CLOSINGz/sys/class/power_supplyz/proc/%s/smapsproc_ioprio_getproc_cpu_affinity_get SC_CLK_TCKi littlei AddressFamilyAF_LINKr"c@seZdZdZdZdZdZdS) IOPriorityrrr:r"N)__name__ __module__ __qualname__r$r%r&r'r?r?B/opt/alt/python38/lib64/python3.8/site-packages/psutil/_pslinux.pyr;wsr;) RSDTtZXxKWIP) Z01Z02Z03Z04Z05Z06Z07Z08Z09Z0AZ0Bsvmemtotal availablepercentusedfreeactiveinactivebufferscachedsharedslabsdiskioZ read_countZ write_countZ read_bytesZ write_bytesZ read_timeZ write_timeZread_merged_countZwrite_merged_count busy_time popenfilepathfdZpositionmodeflagspmemz"rss vms shared text lib data dirtypfullmem)usspssswap pmmap_groupedrsssizercZ shared_cleanZ shared_dirtyZ private_cleanZ private_dirtyZ referencedZ anonymousrd pmmap_extz addr perms  pioZ read_charsZ write_chars pcputimesusersystem children_userchildren_systemiowaitcCs:t|}|dd}|dr6t|s6|dd}|S)zWrapper around os.readlink().r (deleted)N)osreadlinksplitendswithr)r\r?r?r@rus   rucCsXtjdtjdtjdi}||tjtjBtjB@}|tj@rH|ddd}|dd}|S)zZConvert file's open() flags into a readable string. Used by Process.open_files(). rwzw+arzr+)rtO_RDONLYO_WRONLYO_RDWRO_APPENDreplace)r_Z modes_mapr^r?r?r@file_flags_to_modes   rcCs4|dd}d}|rd|}nd|}t|tjS)zReturn True if the given name refers to a root device (e.g. "sda", "nvme0n1") as opposed to a logical partition (e.g. "sda1", "nvme0n1p1"). If name is a virtual device (e.g. "loop1", "ram") return True. /!Tz /sys/block/%sz/sys/block/%s/device)rrtaccessF_OK)nameZincluding_virtualr\r?r?r@is_storage_devices  rc Cstd|}|dd}W5QRXdddddd d g}t|}|d krX|d |d krj|d|dkr||dtd|adS)zSet a namedtuple of variable fields depending on the CPU times available on this Linux kernel version which may be: (user, nice, system, idle, iowait, irq, softirq, [steal, [guest, [guest_nice]]]) Used by cpu_times() function. %s/statrNrlnicermZidlerpZirqZsoftirqZsteal Zguest Z guest_nice scputimes)rreadlinervlenappendrr) procfs_pathfvaluesfieldsZvlenr?r?r@set_scputimes_ntuples    rTc Csjz:|rt|nt|}|W5QRWSQRXWn*ttfk rd|tk r^|YSYnXdS)zReturn file content. fallback: the value returned in case the file does not exist or cannot be read binary: whether to open the file in binary or text mode. N)rrreadstripIOErrorOSError_DEFAULT)fnamefallbackbinaryrr?r?r@cats$r/procrzuser system idle)prlimit)Z use_errnorcCsGdddtj}|}|dkr8t||dt|}n6|}|d|_|d|_t||t|t|}|dkrt}t|t ||j|jfS)Nc@s eZdZdejfdejfgZdS)zprlimit..StructRlimitrlim_currlim_maxN)r<r=r>ctypesZ c_longlongZ_fields_r?r?r?r@ StructRlimitJsrrr) rZ StructurelibcrZbyrefrrZ get_errnorrtstrerror)pid resource_limitsrcurrentretnewerrnor?r?r@rIs"  cCs"g|]}|dr|r|qS)ZRLIM) startswithisupper.0rHr?r?r@ bs rc Cs|d}||dd}z|d}|d}|d}Wntk rL|YSXztdt}Wntk rx|YSXd}|6|D]*}|}|dr|t|d 7}qW5QRX|t 9}||} ||} | t | d |8} | | 7} | |t |d |7} t| S) aFallback for kernels < 3.14 where /proc/meminfo does not provide "MemAvailable:" column, see: https://blog.famzah.net/2014/09/24/ This code reimplements the algorithm outlined here: https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/ commit/?id=34e431b0ae398fc54ea69ff85ec700722c9da773 XXX: on recent kernels this calculation differs by ~1.5% than "MemAvailable:" as it's calculated slightly differently, see: https://gitlab.com/procps-ng/procps/issues/42 https://github.com/famzah/linux-memavailable-procfs/issues/2 It is still way more realistic than doing (free + cached) though. MemFree:Cached:rs Active(file):sInactive(file): SReclaimable:z %s/zoneinfoslowrr:g@) getKeyErrorrr rrrintrvPAGESIZEmin) memsrRrZlru_active_fileZlru_inactive_fileZslab_reclaimablerZ watermark_lowlineavailZ pagecacher?r?r@calculate_avail_vmemjs2     rc Csg}i}tdt0}|D]$}|}t|dd||d<qW5QRX|d}|d}z |d}Wn"tk rd}|dYnXz |d }Wn"tk rd}|d YnX||d d7}z |d } WnHtk r z |d } Wn$tk rd} |dYnXYnXz |d} Wn$tk rRd} |dYnXz |d} WnXtk rz|d|d|d} Wn$tk rd} |dYnXYnXz |d} Wntk rd} YnX||||} | dkr||} z |d}Wntk r.t|}YnX|dkrHd}|d||krV|}t|||dd}|rdd |t |dkrdndf}t |t t|||| || | ||| | S)aReport virtual memory stats. This implementation matches "free" and "vmstat -s" cmdline utility values and procps-ng-3.3.12 source was used as a reference (2016-09-18): https://gitlab.com/procps-ng/procps/blob/ 24fd2605c51fccc375ab0287cec33aa767f06718/proc/sysinfo.c For reference, procps-ng-3.3.10 is the version available on Ubuntu 16.04. Note about "available" memory: up until psutil 4.3 it was calculated as "avail = (free + buffers + cached)". Now "MemAvailable:" column (kernel 3.14) from /proc/meminfo is used as it's more accurate. That matches "available" column in newer versions of "free". %s/meminforrs MemTotal:rsBuffers:rUrrVrsShmem:s MemShared:rWsActive:rSs Inactive:s Inact_dirty:s Inact_clean:sInact_laundry:rTsSlab:s MemAvailable:rOZround_z6%s memory stats couldn't be determined and %s set to 0, ZwasZwere)rr rvrrrrrrjoinrwarningswarnRuntimeWarningrM)Zmissing_fieldsrrrrrNrRrUrVrWrSrTrXrQrrPmsgr?r?r@virtual_memorys$                rc Csi}tdt0}|D]$}|}t|dd||d<qW5QRXz|d}|d}Wn:tk rt\}}}}}}}||9}||9}YnX||}t||dd} ztdt}WnDtk r} z$d t | } t | t d} } W5d } ~ XYnX|d } } |D]n}| d rDt|d dd d} n&| drjt|d dd d} | d k r| d k rqqd} t | t d} } W5QRXt|||| | | S)zReturn swap memory metrics.rrrrs SwapTotal:s SwapFree:rz %s/vmstatzP'sin' and 'sout' swap memory stats couldn't be determined and were set to 0 (%s)Nspswpin r#spswpoutzK'sin' and 'sout' swap memory stats couldn't be determined and were set to 0)rr rvrrcextZ linux_sysinforrstrrrrrrZsswap)rrrrrNrR_Zunit_multiplierrQrPerrrZsinZsoutr?r?r@ swap_memorysF$      rc Cs^t}t|td|}|}W5QRX|dttjd}dd|D}t|S)zReturn a named tuple representing the following system-wide CPU times: (user, nice, system, idle, iowait, irq, softirq [steal, [guest, [guest_nice]]]) Last 3 fields may not be available on all Linux kernel versions. rrcSsg|]}t|tqSr?float CLOCK_TICKSrr?r?r@r^szcpu_times..)r rrrrvrr_fields)rrrrr?r?r@ cpu_timesRsrc Cst}t|g}td|l}||D]L}|dr,|}|dttjd}dd|D}t|}| |q,|W5QRSQRXdS)zfReturn a list of namedtuple representing the CPU times for every CPU available on the system. rscpurcSsg|]}t|tqSr?rrr?r?r@rpsz!per_cpu_times..N) r rrrrrvrrrr)rcpusrrrrentryr?r?r@ per_cpu_timesbs  rc Csz tdWStk rd}tdt&}|D]}|dr4|d7}q4W5QRX|dkrtd}t dt0}|D]$}| dd}| |r|d7}qW5QRX|dkrYd S|YSXd S) z0Return the number of logical CPUs in the system.SC_NPROCESSORS_ONLNr %s/cpuinfos processorrzcpu\drriN) rtsysconf ValueErrorrr lowerrrecompilerrvmatch)numrrsearchr?r?r@cpu_count_logicalvs$   rc Cs t}d}d}t|p t|D]*}t|}||W5QRXq"t|}|dkrb|Si}i}tdtv}|D]j}|}|sz|d||d<Wnt k rYnXi}q~| dr~| dd \} } t | || <q~W5QRXt |}|pd S) z2Return the number of physical cores in the system.z9/sys/devices/system/cpu/cpu[0-9]*/topology/core_cpus_listz?/sys/devices/system/cpu/cpu[0-9]*/topology/thread_siblings_listrr cpu cores physical id)rrs :rN)setglobraddrrrr rrrrvrsumr) lsZp1Zp2r\rresultmappingZ current_inforkeyvaluer?r?r@cpu_count_physicals4    rc Cstdt}d}d}d}|D]r}|dr@t|d}n6|dr\t|d}n|drvt|d}|dk r |dk r |dk r qq W5QRXd}t||||S)z*Return various CPU stats as a named tuple.rNsctxtrsintrssoftirqr)rr rrrvrZ scpustats)rZ ctx_switchesZ interruptsZsoft_interruptsrZsyscallsr?r?r@ cpu_statss,   rz'/sys/devices/system/cpu/cpufreq/policy0z$/sys/devices/system/cpu/cpu0/cpufreqcCsdd}g}ttD]}||}|s(qtjj}t||ddd}|dkrlt||ddd}|dkrltdt|d}tt||d d}tt||d d}|t |||q|S) zReturn frequency metrics for all CPUs. Contrarily to other OSes, Linux updates these values in real-time. cSs.d|d|fD]}tj|r|SqdS)Nz(/sys/devices/system/cpu/cpufreq/policy%sz%/sys/devices/system/cpu/cpu%s/cpufreq)rtr\exists)rpr?r?r@get_paths  zcpu_freq..get_pathZscaling_cur_freqNrZcpuinfo_cur_freqz!can't find current frequency fileiZscaling_max_freqZscaling_min_freq) rangerrtr\rrNotImplementedErrorrrrscpufreq)rrnr\ZpjoinZcurrZmax_Zmin_r?r?r@cpu_freqs& rz /proc/cpuinfoc Csbg}tdtF}|D]:}|dr|dd\}}|tt|ddqW5QRX|S)z}Alternate implementation using /proc/cpuinfo. min and max frequencies are not available and are set to None. rscpu mhz:rr) rr rrrvrrrr)rrrrrr?r?r@rs$cCsgS)zGDummy implementation when none of the above files are present. r?r?r?r?r@rsc@s eZdZdS)_Ipv6UnsupportedErrorN)r<r=r>r?r?r?r@rsrc@sZeZdZdZddZddZddZedd Zedd d Z edd dZ dddZ d S) ConnectionsawA wrapper on top of /proc/net/* files, retrieving per-process and system-wide open connections (TCP, UDP, UNIX) similarly to "netstat -an". Note: in case of UNIX sockets we're only able to determine the local endpoint/path, not the one it's connected to. According to [1] it would be possible but not easily. [1] http://serverfault.com/a/417946 c Csdtjtjf}dtjtjf}dtjtjf}dtjtjf}dtjdf}|||||f||f|f|f||f|f|f|f||||f||f||fd |_d|_dS)Ntcptcp6udpudp6unix) allrtcp4rrudp4rrinetZinet4Zinet6)socketAF_INET SOCK_STREAMAF_INET6Z SOCK_DGRAMZAF_UNIXtmap _procfs_path)selfrrrrrr?r?r@__init__ s$    zConnections.__init__c Cstt}td|j|fD]}ztd|j||f}WnRttfk rTYqYqtk r}z|j t j krxWYqW5d}~XYqX| dr|dddd}|| |t |fq|S)N%s/%s/fd %s/%s/fd/%szsocket:[rr6)rlistrtlistdirr rurr rrEINVALrrr)r rinodesr]inoderr?r?r@get_proc_inodes7s  zConnections.get_proc_inodesc CsHi}tD]8}z|||Wq tttfk r@Yq Yq Xq |SN)pidsupdaterrr r)r rrr?r?r@get_all_inodesMs  zConnections.get_all_inodesc Cs|d\}}t|d}|s dStr.|d}|tjkrntrZt|t |ddd}qt|t |}nxt |}zJtrttj t j d t d|}n ttj t j d t d|}Wn"tk rtstnYnXt||S) aAccept an "ip:port" address as displayed in /proc/net/* and convert it into a human readable form, like: "0500000A:0016" -> ("10.0.0.5", 22) "0000000000000000FFFF00000100007F:9E49" -> ("::ffff:127.0.0.1", 40521) The IP address portion is a little or big endian four-byte hexadecimal number; that is, the least significant byte is listed first, so we need to reverse the order of the bytes to convert it to an IP address. The port is represented as a two-byte hexadecimal number. Reference: http://linuxdevcenter.com/pub/a/linux/2000/11/16/LinuxAdmin.html :r?asciiNr6>4I<4I)r)r)rvrr!encoderr LITTLE_ENDIANZ inet_ntopbase64Z b16decoderstructpackunpackrrrraddr)r#familyZipZportr?r?r@decode_address]s4    zConnections.decode_addressNc cs@|drtj|sdSt|td}|t|dD]\}}z(|dd\ }} } } }}}}}} Wn&t k rt d|||fYnX| |kr|| d\} }nd\} }|dk r|| krq.z %s/net/%s)r1)rrrr r rrrrrrr6r:rZpconnZsconnrr)r kindrrrZ proto_namer$r0r\rr]r3r4r5Z bound_pidZconnr?r?r@retrievesL  zConnections.retrieve)N)N)N) r<r=r>__doc__r rr staticmethodr%r6r:r=r?r?r?r@rs  2 ' %rrcCs t|S)z$Return system-wide open connections.) _connectionsr=)r<r?r?r@net_connectionssrAcCstdt}|}W5QRXi}|ddD]x}|d}|d|}||dd}tt|\}}} } } } } }}}}}}}}}||||| || |f||<q2|S)zsReturn network I/O statistics for every network interface installed on the system as a dict of raw tuples. z %s/net/devr:Nrr)rr readlinesrfindrrvmapr)rlinesretdictrZcolonrrZ bytes_recvZ packets_recvZerrinZdropinZfifoinZframeinZ compressedinZ multicastinZ bytes_sentZ packets_sentZerroutZdropoutZfifooutZ collisionsoutZ carrieroutZ compressedoutr?r?r@net_io_counterss>  rGc Cstjttjttjti}t}i}|D]t}z&t |}t |}t |\}}Wn0t k r}z|jtjkrrW5d}~XYq(Xt|||||||<q(|S)z)Get NIC stats (isup, duplex, speed, mtu).N)rZ DUPLEX_FULLrZ DUPLEX_HALFrZDUPLEX_UNKNOWNrrGkeys cext_posixZ net_if_mtuZnet_if_is_runningZnet_if_duplex_speedrrZENODEVrZ snicstats) Z duplex_mapnamesrrZmtuZisupZduplexZspeedrr?r?r@ net_if_stats+s$    rKFc Csdd}dd}tjdtr*|}n"tjdr>|}ntdti}|D]T}|\ }}}} } } } } }}|s~t|s~qT| t9} | t9} ||| | | | | ||f ||<qT|S)zcReturn disk I/O statistics for every disk installed on the system as a dict of raw tuples. c ss0tdt}|}W5QRX|D]}|}t|}|dkr|d}t|d}tt|dd\ }}} } } } } }}}n|dks|dkr|d}tt|dd\ }}}} } } } } }}}nN|dkr|d}tt|dd\}}} } d } } }} }n td |||| || | | || |f Vq&dS) N %s/diskstatsr"r:r#r7rz!not sure how to interpret line %r)rr rBrvrrrDr)rrErrZflenrreads reads_mergedrbytesrtimewrites writes_mergedwbyteswtimerrZr?r?r@ read_procfsLsH     z%disk_io_counters..read_procfsc sstdD]}ttjd|D]\}}}d|kr6q"ttj|d}|}W5QRXtj |}t t |dd\ }}} } } } } }}}||| | | | ||| |f Vq"q dS)N /sys/blockstatr) rtrwalkr\rrrrrvbasenamerDr)blockrootrfilesrrrrPrQrRrSrTrUrVrWrZr?r?r@ read_sysfsws&  z$disk_io_counters..read_sysfsrLrYzC%s/diskstats nor /sys/block filesystem are available on this system)rtr\rr rrDISK_SECTOR_SIZE)ZperdiskrXr`genrFrrrPrTrRrVrSrWrQrUrZr?r?r@disk_io_countersHs6+     rcc Cst}t}td|R}|D]F}|}|dsD||q|dd}|dkr|dqW5QRX|dkrtj drtj d}ntj d|}g}t |}|D]X} | \} } }} | d krd } |s| d ks||krqd } }t | | || | |}||q|S) z8Return mounted disk partitions as a list of namedtuples.z%s/filesystemsZnodev rZzfsrz /etc/mtabz%s/self/mountsZnoner8N)rr rrrrrvrtr\isfilerealpathrdisk_partitionsrZ sdiskpartr)rZfstypesrrrZfstypeZ mounts_pathretlistZ partitions partitionZdeviceZ mountpointZoptsZmaxfileZmaxpathntupler?r?r@rgs:     rgc Cshtt}td}|tdttdd|D}td}td}|D]"}| d|}||krR| |qR|D]}z>|d}t t |d }t jt j|d }t |d d } Wntttfk rYqzYnXt |d dd} t |ddd} t |ddd d} | dk rFzt | d } Wntk rDd} YnX| dk r|zt | d } Wntk rzd} YnX||  | || | fqz|s`td}tt|}|D]}z.z5/sys/devices/platform/coretemp.*/hwmon/hwmon*/temp*_*z'/sys/devices/platform/coretemp.*/hwmon/z/sys/class/hwmon/_inputg@@rFrZ_maxNrZ_crit_labelr8rrz /sys/class/thermal/thermal_zone*Ztemptypezignoring %r for file %rz /trip_point*cSs,g|]$}dtj|dddqS)rrr")rrtr\r\rv)rrr?r?r@r%sZ_typecriticalZ_temphigh) collectionsrrrextendsortedrrrsubrrrrtr\rdirnamerrrr dict)r basenamesZ basenames2replrZaltnamebaser\r unit_namersrrlabelrZ trip_pathsZ trip_pointsZ trip_pointZ trip_typer?r?r@sensors_temperaturess                   rc Cstt}td}|s"td}ttdd|D}|D]}ztt|d}Wn>tt fk r}zt d|t WYq.rmz ignoring %rNrFrnror8rp)rtrrrrvrrrrrrrrrtr\rrxrrZsfanry)rrzr|rrr}r~r?r?r@ sensors_fansCs"   rc stfdd}ddttD}|s.dStjtt|d}||d|d}||d |d }||d |d }||d }|dk r|dk rzd||}Wqtk rd}YqXn tt |ddd}|dkrdSd}|tjtdtjtd} | dk r| dk}n4t |dddd } | dkr>d}n| dkrLd}|rZt j } nv|dk r|dk rzt||d} Wntk rt j } YnXn.|dk rt|d} | dkrt j } nt j } t || |S)aReturn battery information. Implementation note: it appears /sys/class/power_supply/BAT0/ directory structure may vary and provide files with the same meaning but under different names, see: https://github.com/giampaolo/psutil/issues/966 cs:|D]0}t|d}|kr|r,t|n|SqdS)zvAttempt to read the content of multiple files which may not exist. If none of them exist return None. rN)risdigitr)pathsr\rZnullr?r@ multi_catls  z"sensors_battery..multi_catcSs&g|]}|dsd|kr|qS)ZBATZbattery)rrrr?r?r@rvs  z#sensors_battery..Nrz /energy_nowz /charge_nowz /power_nowz /current_nowz /energy_fullz /charge_fullz/time_to_empty_nowgY@rz /capacityr6rz AC0/onlinez AC/onlinerz/statusr8FrpZ discharging)ZchargingZfullTi<)objectrtrPOWER_SUPPLY_PATHr\rrvZeroDivisionErrorrrrrZPOWER_TIME_UNLIMITEDZPOWER_TIME_UNKNOWNZsbattery) rZbatsr^Z energy_nowZ power_nowZ energy_fullZ time_to_emptyrPZ power_pluggedZonliner5Zsecsleftr?rr@sensors_batterycsh            rc Cs\g}t}|D]F}|\}}}}}}|s*q|dkr6d}t||pBd|||} || q|S)z:Return currently connected users as a list of namedtuples.)z:0.0z:0Z localhostN)rusersrZsuserr) rhZrawlistitemrlZttyZhostnameZtstampZ user_processrntr?r?r@rs rc Csndt}t|R}|D]:}|drt|d}|a|W5QRSqtd|W5QRXdS)zAReturn the system boot time expressed in seconds since the epoch.rsbtimerzline 'btime' not found in %sN)r rrrrrv BOOT_TIMEr,)r\rrrr?r?r@ boot_times   rcCsddtttDS)z7Returns a list of PIDs currently running on the system.cSsg|]}|rt|qSr?)rrrr?r?r@rszpids..)rtrrr r?r?r?r@rsrc Cst|sdSzpdt|f}t|P}|D]8}|dr,t|d}||kW5QRWSq,td|W5QRXWn"ttfk r|t kYSXdS)zcCheck for the existence of a unix PID. Linux TIDs are not supported (always return False). F %s/%s/statussTgid:rz'Tgid' line not found in %sN) r pid_existsr rrrrvrEnvironmentErrorr)rr\rrZtgidr?r?r@rs    rc Csi}t}tD]x}z(td||f}|}W5QRXWnttfk rTYqX|d}||dd}t|d}|||<q|S)zsObtain a {pid: ppid, ...} dict for all running processes in one shot. Used to speed up Process.children(). %s/%s/stat)r:Nr) r rrrrr rCrvr)rrrrdatarparZdsetppidr?r?r@ppid_map s    rcstfdd}|S)zlDecorator which translates bare OSError and IOError exceptions into NoSuchProcess and AccessDenied. csz|f||WStk r4t|j|jYn\tk rTt|j|jYn<tk rtj d|j |jfst|j|jYnXdS)N%s/%s) rr r_namer rrrtr\rr )r argskwargsfunr?r@wrapper%sz wrap_exceptions..wrapper) functoolswraps)rrr?rr@wrap_exceptions!s rc@steZdZdZdddddgZddZd d Zeed d Z eed dZ eeddZ ddZ ddZ eddZddZeddZeddZeddZejdered d!Zed"d#Zed$d%Zed`d'd(Zed)d*Zed+d,Zer.eed-ed.ed/fd0d1Z neZ erDed2d3Z!ed4d5Z"eed6fd7d8Z#eed9fd:d;Z$edd?Z&ed@dAZ'e(redBdCZ)edDfdEdFZ*edGdHZ+e,redIdJZ-edKdLZ.e/d&k redadMdNZ0edOdPZ1edQdRZ2edbdTdUZ3edVdWZ4edXdYZ5eedZfd[d\Z6eed]fd^d_Z7d&S)cProcesszLinux process implementation.rr_ppidr _cachecCs||_d|_d|_t|_dSr)rrrr r )r rr?r?r@r ;szProcess.__init__cCstd|j|jfdS)z+Raise NSP if the process disappeared on us.rN)rtrZr rr r?r?r@ _assert_aliveAszProcess._assert_alivec Cstd|j|jf}|}W5QRX|d}||dd|}||dd}i}||d<|d|d <|d|d <|d |d <|d |d<|d|d<|d|d<|d|d<|d|d<|d|d<|d|d<|S)aZParse /proc/{pid}/stat file and return a dict with various process info. Using "man proc" as a reference: where "man proc" refers to position N always substract 3 (e.g ppid position 4 in 'man proc' == position 1 in here). The return value is cached in case oneshot() ctx manager is in use. rr(rr:Nrrr5rr#ttynr utime stime children_utimerNchildren_stime create_time$cpu_num' blkio_ticks)rr rrrCfindrv)r rrrrrrr?r?r@_parse_stat_fileGs$            zProcess._parse_stat_filec Cs4td|j|jf}|W5QRSQRXdS)zRead /proc/{pid}/stat file and return its content. The return value is cached in case oneshot() ctx manager is in use. rN)rr rrr rr?r?r@_read_status_filejszProcess._read_status_filec Cs<td|j|jftd}|W5QRSQRXdS)Nz %s/%s/smapsr')rr rr*rrrr?r?r@_read_smaps_filets zProcess._read_smaps_filecCs(|j||j||j|dSr)rZcache_activaterrrr?r?r@ oneshot_enter{s  zProcess.oneshot_entercCs(|j||j||j|dSr)rZcache_deactivaterrrr?r?r@ oneshot_exits  zProcess.oneshot_exitcCs|d}trt|}|S)Nr)rr!r )r rr?r?r@rs z Process.namec Csztd|j|jfWSttfk rxtjd|j|jfrHYdSt|jsbt |j|j nt |j|j |j Yn"t k rt|j|j YnXdS)Nz %s/%s/exerr8)rur rrr rtr\lexistsrrrrrrr rr?r?r@exes z Process.exec Cstd|j|jf}|}W5QRX|s0gS|dr>dnd}||rX|dd}||}|dkrt|dkrd|kr|d}|S)Nz %s/%s/cmdlinerqrir6r)rr rrrwrvr)r rrsepcmdliner?r?r@rs    zProcess.cmdlinec Cs0td|j|jf}|}W5QRXt|S)Nz %s/%s/environ)rr rrr)r rrr?r?r@environszProcess.environcCs>t|d}t}z ||WStk r8YdSXdS)Nr)rrrZget_terminal_mapr)r Ztty_nrrr?r?r@terminals  zProcess.terminalz /proc/%s/ioc Csd|j|jf}i}t|T}|D]H}|}|r"z|d\}}Wntk r\Yq"Yq"Xt|||<q"W5QRX|std|z,t|d|d|d|d|d|d WSt k r}ztd |d ||fW5d}~XYnXdS) Nz%s/%s/ios: z%s file was emptyssyscrssyscws read_bytess write_bytessrcharswcharz1%r field was not found in %s; found fields are %rr) r rrrrvrrr,rjr)r rrrrrrrr?r?r@ io_counterss4    zProcess.io_counterscCsh|}t|dt}t|dt}t|dt}t|dt}t|dt}t|||||S)Nrrrrr)rrrrk)r rrrrrrpr?r?r@rszProcess.cpu_timescCst|dS)zWhat CPU the process is on.rrrrr?r?r@rszProcess.cpu_numNcCst|j||jSr)rZwait_pidrr)r Ztimeoutr?r?r@waitsz Process.waitcCs&t|d}tpt}|t|S)Nr)rrrrr)r ctimeZbtr?r?r@rs zProcess.create_timec Cs`td|j|jf2}dd|ddD\}}}}}}}W5QRXt|||||||S)Nz %s/%s/statmcSsg|]}t|tqSr?)rrrr?r?r@rsz'Process.memory_info..r7)rr rrrvr`) r rZvmsrfrWtextlibrZdirtyr?r?r@ memory_infos zProcess.memory_infos\nPrivate.*:\s+(\d+)s\nPss\:\s+(\d+)s\nSwap\:\s+(\d+)c Csj|}|}ttt||d}ttt||d}ttt||d}t||||fS)Nr)rrrrDrfindallra) r Z _private_reZ_pss_reZ_swap_reZ basic_memZ smaps_datarbrcrdr?r?r@memory_full_infos  zProcess.memory_full_infocCsTdd}|}|sgS|d}g}|d}|g}|||D] \}}|dd}z|\} } } } } }Wn*tk r|dg\} } } } } }YnX|sd}n2trt|}|}|d rt|s|dd }| t| t| || d d| d d| d d| dd| dd| dd| dd| dd| dd| ddf q@|S)aPReturn process's mapped memory regions as a list of named tuples. Fields are explained in 'man proc'; here is an updated (Apr 2012) version: http://goo.gl/fmebo /proc/{PID}/smaps does not exist on kernels < 2.6.14 or if CONFIG_MMU kernel configuration option is not enabled. c ssi}|D]}|dd}|dds@||fV||qzt|dd||d<Wqtk r|ddrYqn td|YqXq||fVdS)NrrrrsVmFlags:z#don't know how to interpret line %r)rvrwpoprrrr)rE current_blockrrrr?r?r@ get_blocksEs  z'Process.memory_maps..get_blocks rNrr8z[anon]rrrssRss:sSize:sPss:s Shared_Clean:s Shared_Dirty:sPrivate_Clean:sPrivate_Dirty:s Referenced:s Anonymous:sSwap:) rrvrrr!r rrwrrr)r rrrErZ first_linerheaderZhfieldsr#ZpermsoffsetZdevrr\r?r?r@ memory_maps<sP                 zProcess.memory_mapsc Cs`ztd|j|jfWSttfk rZt|jsDt|j|jnt|j|j|j YnXdS)Nz %s/%s/cwd) rur rrr rrrrrrr?r?r@cwds  z Process.cwdsctxt_switches:\t(\d+)cCsL|}||}|s,td|j|jfntt|dt|dSdS)Nz'voluntary_ctxt_switches' and 'nonvoluntary_ctxt_switches'lines were not found in %s/%s/status; the kernel is probably older than 2.6.23rr)rrrr rrZpctxswr)r Z _ctxsw_rerZctxswr?r?r@num_ctx_switchess zProcess.num_ctx_switchessThreads:\t(\d+)cCs|}t||dSNr)rrr)r Z_num_threads_rerr?r?r@ num_threadsszProcess.num_threadsc Cstd|j|jf}|g}d}|D]}d|j|j|f}z$t|}|}W5QRXWntk rd}Yq*YnX|| ddd}| d}t |dt } t |d t } t t|| | } || q*|r||S) Nz %s/%s/taskFz%s/%s/task/%s/statTrr:rrr)rtrr rsortrrrrrrvrrrZpthreadrrr) r Z thread_idsrh hit_enoentZ thread_idrrstrrrrjr?r?r@threadss2    zProcess.threadscCs t|jSr)rI getpriorityrrr?r?r@nice_getszProcess.nice_getcCst|j|Sr)rI setpriorityr)r rr?r?r@nice_setszProcess.nice_setcCs t|jSr)rr4rrr?r?r@cpu_affinity_getszProcess.cpu_affinity_getsCpus_allowed_list:\t(\d+)-(\d+)cCsV|}||}|r@ttt|ddt|dddSttttSdS)Nrr)rrrrrrr)r Z_rerrr?r?r@_get_eligible_cpuss  *zProcess._get_eligible_cpusc Cszt|j|Wnttfk r}zpt|ts>|jtjkr|}t t t t }|D]4}||krxtd||f||kr\td||fq\W5d}~XYnXdS)Nz(invalid CPU number %r; choose between %sz0CPU number %r is not eligible; choose between %s) rZproc_cpu_affinity_setrrr isinstancerrrtuplerrr)r rrZ eligible_cpusZall_cpusZcpur?r?r@cpu_affinity_sets*zProcess.cpu_affinity_setcCs,t|j\}}tdk r t|}t||Sr)rr3renumr;rZpionicer Zioclassrr?r?r@ ionice_getszProcess.ionice_getcCsP|dkr d}|r(|ttfkr(td||dks8|dkr@tdt|j||S)Nrz%r ioclass accepts no valuer7zvalue not in 0-7 range)r'r$rrZproc_ioprio_setrrr?r?r@ ionice_sets zProcess.ionice_setc Cs|jdkrtdzD|dkr*t|j|WSt|dkrFtdt|t|j||WnNtk r}z0|jtjkrt|jrt |j|j |j nW5d}~XYnXdS)Nrz)can't use prlimit() against PID 0 processr:z4second argument must be a (soft, hard) tuple, got %s) rrrrr;rrZENOSYSrrrr)r rrrr?r?r@rlimits   zProcess.rlimitcCs$|d}tr|}t|dS)Nr5?)rr!r PROC_STATUSESr)r Zletterr?r?r@r5s zProcess.statusc Cs^g}td|j|jf}d}|D]&}d|j|j|f}z t|}WnVttfk rfd}Yq"Yq"tk r}z|jtj krWYq"W5d}~XYq"X| dr"t |r"d|j|j|f}zBt |0}t |d} t |dd} W5QRXWntk rd}Yq"Xt| } t|t |t | | | } || q"|rZ||S) Nr Fr Trz%s/%s/fdinfo/%srr)rtrr rrurr rrrrrrrrrvrr[rr) r rhr_rr]r/r\rrposr_r^rjr?r?r@ open_files&sL    $  zProcess.open_filesrcCst||j}||Sr)r@r=rr)r r<rr?r?r@ connectionsRszProcess.connectionscCsttd|j|jfS)Nr )rrtrr rrr?r?r@num_fdsXszProcess.num_fdscCst|dS)Nrrrr?r?r@r\sz Process.ppidsUid:\t(\d+)\t(\d+)\t(\d+)cCs6|}||d\}}}tt|t|t|Sr)rrrZpuidsr)r Z_uids_rerreal effectivesavedr?r?r@uids`sz Process.uidssGid:\t(\d+)\t(\d+)\t(\d+)cCs6|}||d\}}}tt|t|t|Sr)rrrZpgidsr)r Z_gids_rerrrrr?r?r@gidsfsz Process.gids)N)N)r)8r<r=r>r> __slots__r rrrrrrrrrrrrrrtr\rgetpidrrrrrr HAS_SMAPSrrrrrrrrrrHAS_CPU_AFFINITYrrrHAS_PROC_IO_PRIORITYrrrrr5rrrrrrr?r?r?r@r6s !             C             +   r)N)r)F)F)r>Z __future__rrrtrrrrtrrr sys tracebackrrrr8rrrrr rIr r r r rrrrrrrrrrrrrrZ_compatrrrrr r! version_inforZ__extra__all__rr\rrrhasattrrrrrrrZ getpagesizerrr* byteorderrraZ AF_PACKETr9IntEnumrr8r$r%r&r'r;globalsr __members__ZSTATUS_RUNNINGZSTATUS_SLEEPINGZSTATUS_DISK_SLEEPZSTATUS_STOPPEDZSTATUS_TRACING_STOPZ STATUS_ZOMBIEZ STATUS_DEADZSTATUS_WAKE_KILLZ STATUS_WAKINGZ STATUS_IDLEZ STATUS_PARKEDrr(r)r*r+r,r-r.r/r0r1r2r-rMrYr[r`rrarerrhrjrkrurrrr Exception print_excrrresource ImportErrorrZCDLLrrudirrrrrrrrrrZ net_if_addrsrrr@rArGrKZ disk_usagercrgrrrrrrrrrrr?r?r?r@s                                                    4z:*    k % _ +q ^