grthtrhthjhtyjytjytkergtrhtrjytjerhrfh4:24 29/09/2026a MÝ_µ@ã @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#k�rîddl2Z2ndZ2gd$¢Z3d%Z4ej5 6d&e 7¡¡Z8e9ed'ƒZ:e9ed(ƒZ;e<ƒZ=e >d)¡Z?e @¡ZAdaBe0�rLd*nd+ZCe jDd,kZEd-ZFe2du�rpe jGZHne2 Id.d/eJe jGƒi¡ZKeKjHZHe2du�r¨dZLdZMd0ZNd1ZOn Gd2d3„d3e2jIƒZPeQƒ RePjS¡ejTejUejVejWejXejYejZejZej[ej\ej]ej^d4œ Z_ej`ejaejbejcejdejeejfejgejhejiejjd5œ Zked6gd7¢ƒZled8gd9¢ƒZmed:gd;¢ƒZnedeojpd?ƒZqed@gdA¢ƒZredBdCdD serjp¡ƒZtedEgdF¢ƒZuedGgdH¢ƒZvdIdJ„ZwdKdL„ZxdMdN„ZyedOdP„ƒZze=dQfdRdS„Z{z ezdTƒWn.e|�y e  }¡edUdVƒdWdWdWƒa~Yn0dZzddXl€mZWn@e��yvddl‚Z‚e‚jƒddQdY�Z„e9e„dZƒ�rrd™d[dZ„ZYn0edu�rše3 …d\d]„e†eƒDƒ¡d^d_„Z‡d`da„Zˆdbdc„Z‰ddde„ZŠdfdg„Z‹dhdi„ZŒdjdk„Z�dldm„ZŽej5 6dn¡�söej5 6do¡�rdpdq„Z�n ej5 6dr¡�rdsdq„Z�ndtdq„Z�ej�Z�Gdudv„dve|ƒZ‘Gdwdx„dxƒZ’e’ƒZ“dšdzd{„Z”d|d}„Z•d~d„Z–ej—Z—d›d�d‚„Z˜dœdƒd„„Z™d…d†„Zšd‡dˆ„Z›d‰dŠ„Zœd‹dŒ„Z�d�dŽ„Zžd�d�„ZŸd‘d’„Z d“d”„Z¡d•d–„Z¢Gd—d˜„d˜e<ƒZ£dS)�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_PATHÚIOPRIO_CLASS_NONEÚIOPRIO_CLASS_RTÚIOPRIO_CLASS_BEÚIOPRIO_CLASS_IDLEÚCONN_ESTABLISHEDÚ CONN_SYN_SENTÚ CONN_SYN_RECVÚCONN_FIN_WAIT1ÚCONN_FIN_WAIT2ÚCONN_TIME_WAITÚ CONN_CLOSEÚCONN_CLOSE_WAITÚ CONN_LAST_ACKÚ CONN_LISTENÚ CONN_CLOSINGz/sys/class/power_supplyz/proc/%s/smapsÚproc_ioprio_getÚproc_cpu_affinity_getÚ SC_CLK_TCKéÿÿÿÿi ÚlittleiÚ AddressFamilyÚAF_LINKér"c@seZdZdZdZdZdZdS)Ú IOPriorityrrr:r"N)Ú__name__Ú __module__Ú __qualname__r$r%r&r'©r?r?ú5/usr/lib64/python3.9/site-packages/psutil/_pslinux.pyr;wsr;) ÚRÚSÚDÚTÚtÚZÚXÚxÚKÚWÚIÚP) Z01Z02Z03Z04Z05Z06Z07Z08Z09Z0AZ0BÚsvmem) ÚtotalÚ availableÚpercentÚusedÚfreeÚactiveÚinactiveÚbuffersÚcachedÚsharedÚslabÚsdiskio) Ú read_countÚ write_countÚ read_bytesÚ write_bytesZ read_timeZ write_timeZread_merged_countZwrite_merged_countÚ busy_timeÚ popenfile)ÚpathÚfdZpositionÚmodeÚflagsÚpmemz"rss vms shared text lib data dirtyÚpfullmem)ÚussÚpssÚswapÚ pmmap_grouped) r`ÚrssÚsizergZ shared_cleanZ shared_dirtyZ private_cleanZ private_dirtyZ referencedZ anonymousrhÚ pmmap_extz addr perms ú Úpio)rZr[r\r]Z read_charsZ write_charsÚ pcputimes)ÚuserÚsystemÚ children_userÚchildren_systemÚiowaitcCs:t |¡}| d¡d}| d¡r6t|ƒs6|dd…}|S)zWrapper around os.readlink().úrú (deleted)Néöÿÿÿ)ÚosÚreadlinkÚsplitÚendswithr)r`r?r?r@ryÐs   rycCsXtjdtjdtjdi}||tjtjBtjB@}|tj@rH| ddd¡}| dd¡}|S)zZConvert file's open() flags into a readable string. Used by Process.open_files(). ÚrÚwzw+Úarzr+)rxÚO_RDONLYÚO_WRONLYÚO_RDWRÚO_APPENDÚreplace)rcZ modes_maprbr?r?r@Úfile_flags_to_modeäs   r„cCs4| dd¡}d}|rd|}nd|}t |tj¡S)zÜReturn 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)rƒrxÚaccessÚF_OK)ÚnameZincluding_virtualr`r?r?r@Úis_storage_deviceñs  rŠcCs”td|ƒ�$}| ¡ ¡dd…}Wdƒn1s60Ygd¢}t|ƒ}|dkrb| d¡|dkrt| d¡|d kr†| d ¡td |ƒadS) zøSet 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/statrN)rpÚnicerqZidlertZirqZsoftirqéZstealé Zguesté Z guest_niceÚ scputimes)rÚreadlinerzÚlenÚappendrr�)Ú procfs_pathÚfÚvaluesÚfieldsZvlenr?r?r@Úset_scputimes_ntuples 2   r˜Tc CstzF|rt|ƒnt|ƒ�}| ¡ ¡WdƒWS1s:0YWn(ttfyn|turh|YS‚Yn0dS)z·Return 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)rrÚreadÚstripÚIOErrorÚOSErrorÚ_DEFAULT)ÚfnameÚfallbackÚbinaryr•r?r?r@Úcats0r¡ú/procr�zuser system idleç)Úprlimit)Z use_errnor¤cCsšGdd„dtjƒ}|ƒ}|dur8t ||dt |¡¡}n6|ƒ}|d|_|d|_t ||t |¡t |¡¡}|dkrŽt ¡}t|t   |¡ƒ‚|j|jfS)Nc@s eZdZdejfdejfgZdS)zprlimit..StructRlimitÚrlim_curÚrlim_maxN)r<r=r>ÚctypesZ c_longlongZ_fields_r?r?r?r@Ú StructRlimitJsÿr¨rr) r§Z StructureÚlibcr¤Zbyrefr¥r¦Z get_errnorœrxÚstrerror)ÚpidÚ resource_Úlimitsr¨ÚcurrentÚretÚnewÚerrnor?r?r@r¤Is  ÿcCs"g|]}| d¡r| ¡r|‘qS)ZRLIM)Ú startswithÚisupper©Ú.0rHr?r?r@Ú bór¶c Cs|d}|| dd¡}z|d}|d}|d}WntyJ|YS0ztdtƒƒ}Wntyt|YS0d}|�@|D]*}| ¡}| d¡r„|t| ¡d ƒ7}q„Wd ƒn1sÄ0Y|t 9}||} ||} | t | d |ƒ8} | | 7} | |t |d |ƒ7} t| ƒS) a…Fallback 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/zoneinfoslowrNr:g@) ÚgetÚKeyErrorrr r›ršr²ÚintrzÚPAGESIZEÚmin) ÚmemsrRrŸZlru_active_fileZlru_inactive_fileZslab_reclaimabler•Z watermark_lowÚlineÚavailZ pagecacher?r?r@Úcalculate_avail_vmemjs2      4rÃc Cs¼g}i}tdtƒƒ�:}|D]$}| ¡}t|dƒd||d<qWdƒn1sV0Y|d}|d}z |d}Wn tyœd}| d ¡Yn0z |d }Wn tyÊd}| d ¡Yn0|| d d¡7}z |d } WnDt�y,z |d} Wn"t�y&d} | d¡Yn0Yn0z |d} Wn"t�y\d} | d¡Yn0z |d} WnTt�y¾z|d|d|d} Wn"t�y¸d} | d¡Yn0Yn0z |d} Wnt�yäd} Yn0||||} | dk�r||} z |d}Wnt�y0t|ƒ}Yn0|dk�rJd}| d¡||k�rX|}t|||dd�}|�r dd  |¡t |ƒdk�rŒdndf}t   |t ¡t|||| || | ||| | ƒ S)a“Report 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/meminforérNs MemTotal:r¸sBuffers:rUr¹rVrºsShmem:s MemShared:rWsActive:rSs Inactive:s Inact_dirty:s Inact_clean:sInact_laundry:rTsSlab:s MemAvailable:rO©Zround_z6%s memory stats couldn't be determined and %s set to 0ú, ZwasZwere)rr rzr½r¼r“r»rÃrÚjoinr’ÚwarningsÚwarnÚRuntimeWarningrM)Zmissing_fieldsrÀr•rÁr—rNrRrUrVrWrSrTrXrQrÂrPÚmsgr?r?r@Úvirtual_memoryžsŽ8        ÿþÿ        þ   ÿrÍc Csèi}tdtƒƒ�:}|D]$}| ¡}t|dƒd||d<qWdƒn1sR0Yz|d}|d}Wn8ty¨t ¡\}}}}}}}||9}||9}Yn0||}t||dd�} ztd tƒƒ}WnFt�y} z,d t | ƒ} t   | t ¡d} } WYd} ~ nÄd} ~ 00|�¤d} } |D]n}|  d ¡�rXt| d ¡dƒd d} n&|  d¡�r~t| d ¡dƒd d} | du�r,| du�r,�q´�q,d} t   | t ¡d} } Wdƒn1�sÊ0Yt |||| | | ¡S)zReturn swap memory metrics.rÄrrÅrNs SwapTotal:s SwapFree:rÆz %s/vmstatzP'sin' and 'sout' swap memory stats couldn't be determined and were set to 0 (%s)spswpinó r#spswpoutzK'sin' and 'sout' swap memory stats couldn't be determined and were set to 0)rr rzr½r¼ÚcextZ linux_sysinforr›ÚstrrÉrÊrËr²rZsswap)rÀr•rÁr—rNrRÚ_Zunit_multiplierrQrPÚerrrÌZsinZsoutr?r?r@Ú swap_memorysF8  ÿ     (rÓcCsrtƒ}t|ƒtd|ƒ�}| ¡ ¡}Wdƒn1s<0Y|dttjƒd…}dd„|Dƒ}t|ŽS)zíReturn 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. r‹NrcSsg|]}t|ƒt‘qSr?©ÚfloatÚ CLOCK_TICKSr´r?r?r@r¶^r·zcpu_times..)r r˜rr‘rzr’r�Ú_fields)r”r•r–r—r?r?r@Ú cpu_timesRs*rØcCs tƒ}t|ƒg}td|ƒ�n}| ¡|D]L}| d¡r,| ¡}|dttjƒd…}dd„|Dƒ}t|Ž}|  |¡q,|WdƒS1s’0YdS)zfReturn a list of namedtuple representing the CPU times for every CPU available on the system. r‹scpurcSsg|]}t|ƒt‘qSr?rÔr´r?r?r@r¶pr·z!per_cpu_times..N) r r˜rr‘r²rzr’r�r×r“)r”Úcpusr•rÁr–r—Úentryr?r?r@Ú per_cpu_timesbs  rÛc Csòz t d¡WStyìd}tdtƒƒ�0}|D]}| ¡ d¡r2|d7}q2Wdƒn1sb0Y|dkrÖt d¡}t dtƒƒ�:}|D]$}|  d ¡d}|  |¡r’|d7}q’Wdƒn1sÌ0Y|dkräYdS|YS0dS) z0Return the number of logical CPUs in the system.ÚSC_NPROCESSORS_ONLNrú %s/cpuinfos processorrNzcpu\dr‹rm) rxÚsysconfÚ ValueErrorrr Úlowerr²ÚreÚcompilerrzÚmatch)Únumr•rÁÚsearchr?r?r@Úcpu_count_logicalvs$  (  (ræc Cs2tƒ}d}d}t |¡p t |¡D]>}t|ƒ�"}| | ¡ ¡¡Wdƒq"1sV0Yq"t|ƒ}|dkrv|Si}i}tdtƒƒ�~}|D]h}| ¡ ¡}|sÔz|d||d<Wnt yÌYn0i}q’|  d¡r’|  d d ¡\} } t | ƒ|| <q’Wdƒn1�s0Yt | ¡ƒ}|�p0dS) 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_listNrrÝó cpu coresó physical id)rèrçs :r)ÚsetÚglobrÚaddr™ršr’r ràr¼r²rzr½Úsumr–) ÚlsZp1Zp2r`r•ÚresultÚmappingZ current_inforÁÚkeyÚvaluer?r?r@Úcpu_count_physical“s4 2 ÿ  . ròcCsÆtdtƒƒ�”}d}d}d}|D]r}| d¡r@t| ¡dƒ}n6| d¡r\t| ¡dƒ}n| d¡rvt| ¡dƒ}|dur |dur |dur q”q Wdƒn1s¨0Yd}t ||||¡S)z*Return various CPU stats as a named tuple.r‹Nsctxtrsintrssoftirqr)rr r²r½rzrZ scpustats)r•Z ctx_switchesZ interruptsZsoft_interruptsrÁZsyscallsr?r?r@Ú cpu_stats½s&   ÿ$ÿróz'/sys/devices/system/cpu/cpufreq/policy0z$/sys/devices/system/cpu/cpu0/cpufreqcCs¾dd„}g}ttƒƒD]¢}||ƒ}|s(qtjj}t||dƒdd�}|durlt||dƒdd�}|durltdƒ‚t|ƒd}tt||d ƒƒƒd}tt||d ƒƒƒd}| t   |||¡¡q|S) z‚Return 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)rxr`Úexists)räÚpr?r?r@Úget_pathÙs ÿ zcpu_freq..get_pathZscaling_cur_freqN©rŸZcpuinfo_cur_freqz!can't find current frequency fileièZscaling_max_freqZscaling_min_freq) Úrangerærxr`rÈr¡ÚNotImplementedErrorr½r“rÚscpufreq)rör¯Únr`ZpjoinZcurrZmax_Zmin_r?r?r@Úcpu_freqÔs&ÿ rüz /proc/cpuinfoc Csvg}tdtƒƒ�P}|D]:}| ¡ d¡r| dd¡\}}| t t|ƒdd¡¡qWdƒn1sh0Y|S)z}Alternate implementation using /proc/cpuinfo. min and max frequencies are not available and are set to None. rÝscpu mhzó:rr£N) rr ràr²rzr“rrúrÕ)r¯r•rÁrðrñr?r?r@rüõs8cCsgS)zGDummy implementation when none of the above files are present. r?r?r?r?r@rüsc@s eZdZdS)Ú_Ipv6UnsupportedErrorN)r<r=r>r?r?r?r@rþsrþc@sZeZdZdZdd„Zdd„Zdd„Zedd „ƒZedd d „ƒZ edd d„ƒZ ddd„Z 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 Cs˜dtjtjf}dtjtjf}dtjtjf}dtjtjf}dtjdf}|||||f||f|f|f||f|f|f|f||||f||f||fdœ |_d|_dS)NÚtcpÚtcp6ÚudpÚudp6Úunix) ÚallrÚtcp4rrÚudp4rrÚinetZinet4Zinet6)ÚsocketÚAF_INETÚ SOCK_STREAMÚAF_INET6Z SOCK_DGRAMZAF_UNIXÚtmapÚ _procfs_path)Úselfrrrrrr?r?r@Ú__init__ s$   õ zConnections.__init__c CsÊttƒ}t d|j|f¡D]¨}ztd|j||fƒ}WnVttfyRYqYqtyŽ}z&|j t j krxWYd}~q‚WYd}~qd}~00|  d¡r|dd…dd…}||  |t |ƒf¡q|S)Nú%s/%s/fdú %s/%s/fd/%szsocket:[r�r6)rÚlistrxÚlistdirrryrr rœr±ÚEINVALr²r“r½)rr«ÚinodesraÚinoderÒr?r?r@Úget_proc_inodes7s   zConnections.get_proc_inodesc CsFi}tƒD]6}z| | |¡¡Wq tttfy>Yq Yq 0q |S©N)ÚpidsÚupdaterrr r)rrr«r?r?r@Úget_all_inodesMs  zConnections.get_all_inodesc Csø| d¡\}}t|dƒ}|s dStr.| d¡}|tjkrntrZt |t  |¡ddd…¡}qìt |t  |¡¡}n~t  |¡}zRtr¤t tj t j dgt   d|¡¢RŽ¡}n$t tj t j dgt   d|¡¢RŽ¡}Wn tyêtƒsät‚n‚Yn0t ||¡S) a†Accept 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?ÚasciiNr6z>4Iz<4I)rzr½r!Úencoder r Ú LITTLE_ENDIANZ inet_ntopÚbase64Z b16decoder ÚstructÚpackÚunpackrßrrþrÚaddr)r&ÚfamilyZipÚportr?r?r@Údecode_address]s4    þþ zConnections.decode_addressNc csR| d¡rtj |¡sdSt|td���}| ¡t|dƒD]ð\}}z(| ¡dd…\ }} } } }}}}}} Wn$t y�t d|||fƒ‚Yn0| |vr¬|| d\} }nd\} }|durÈ|| krÈq.z %s/net/%s)r5)r rßrÈr rrrrér r r r:r?rZpconnZsconnrër)rÚkindr«rr¯Z proto_namer'r4r`rírar7r8r9Z bound_pidZconnr?r?r@ÚretrieveÞs< ÿ  ÿÿÿÿzConnections.retrieve)N)N)N) r<r=r>Ú__doc__rrrÚ staticmethodr)r:r?rBr?r?r?r@rÿs  2 ' %rÿrcCs t |¡S)z$Return system-wide open connections.)Ú _connectionsrB)rAr?r?r@Únet_connectionssrFcCsÄtdtƒƒ�}| ¡}Wdƒn1s,0Yi}|dd…D]x}| d¡}|d|… ¡}||dd… ¡ ¡}tt|ƒ\}}} } } } } }}}}}}}}}||||| || |f||<qF|S)zsReturn network I/O statistics for every network interface installed on the system as a dict of raw tuples. z %s/net/devNr:rr)rr Ú readlinesÚrfindršrzÚmapr½)r•ÚlinesÚretdictrÁÚcolonr‰r—Z bytes_recvZ packets_recvZerrinZdropinZfifoinZframeinZ compressedinZ multicastinZ bytes_sentZ packets_sentZerroutZdropoutZfifooutZ collisionsoutZ carrieroutZ compressedoutr?r?r@Únet_io_counterss8& ðÿ rMc Cs¤tjttjttjti}tƒ ¡}i}|D]v}z&t   |¡}t   |¡}t  |¡\}}Wn2t y„}z|jtjkrp‚WYd}~q(d}~00t |||||¡||<q(|S)z)Get NIC stats (isup, duplex, speed, mtu).N)rÏZ DUPLEX_FULLrZ DUPLEX_HALFrZDUPLEX_UNKNOWNrrMÚkeysÚ cext_posixZ net_if_mtuZnet_if_is_runningZnet_if_duplex_speedrœr±ZENODEVrZ snicstats) Z duplex_mapÚnamesr¯r‰ZmtuZisupZduplexZspeedrÒr?r?r@Ú net_if_stats+s þ    rQFc Cs®dd„}dd„}tj dtƒ¡r*|ƒ}n"tj d¡r>|ƒ}ntdtƒƒ‚i}|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 ssDtdtƒƒ�}| ¡}Wdƒn1s,0Y|D�]}| ¡}t|ƒ}|dkr”|d}t|dƒ}tt|dd…ƒ\ }}} } } } } }}}n�|dks¤|dkrÖ|d}tt|dd…ƒ\ }}}} } } } } }}}nN|dk�r|d}tt|dd…ƒ\}}} } d } } }} }n td |ƒ‚||| || | | || |f Vq:dS) Nú %s/diskstatsér"r:r#éér;rz!not sure how to interpret line %r)rr rGrzr’r½rIrß)r•rJrÁr—Zflenr‰ÚreadsÚ reads_mergedÚrbytesÚrtimeÚwritesÚ writes_mergedÚwbytesÚwtimerÑr^r?r?r@Ú read_procfsLs4&  ÿ  ÿÿ ÿ  ÿz%disk_io_counters..read_procfsc ssÌt d¡D]¼}t tj d|¡¡D]¢\}}}d|vr6q"ttj |d¡ƒ� }| ¡ ¡ ¡}Wdƒn1sn0Ytj  |¡}t t |dd…ƒ\ }}} } } } } }}}||| | | | ||| |f Vq"q dS)Nú /sys/blockÚstatr�) rxrÚwalkr`rÈrr™ršrzÚbasenamerIr½)ÚblockÚrootrÑÚfilesr•r—r‰rVrWrXrYrZr[r\r]r^r?r?r@Ú read_sysfsws. ÿ ÿz$disk_io_counters..read_sysfsrRr_zC%s/diskstats nor /sys/block filesystem are available on this system)rxr`rôr rùrŠÚDISK_SECTOR_SIZE)Zperdiskr^rfÚgenrKrÚr‰rVrZrXr\rYr]rWr[r^r?r?r@Údisk_io_countersHs0+  ÿÿÿ  ÿ ric Cs&tƒ}tƒ}td|ƒ�\}|D]F}| ¡}| d¡sD| | ¡¡q| d¡d}|dkr| d¡qWdƒn1sz0Y|dkr¦tj  d¡r¦tj  d¡}ntj  d |¡}g}t   |¡}|D]X} | \} } }} | d kräd } |sú| d ksÈ||vrúqÈd} }t  | | || | |¡}| |¡qÈ|S) z8Return mounted disk partitions as a list of namedtuples.z%s/filesystemsZnodevú rZzfsNr¢z /etc/mtabz%s/self/mountsZnoner<)rér rršr²rërzrxr`ÚisfileÚrealpathrÏÚdisk_partitionsrZ sdiskpartr“)rZfstypesr”r•rÁZfstypeZ mounts_pathÚretlistZ partitionsÚ partitionZdeviceZ mountpointZoptsZmaxfileZmaxpathÚntupler?r?r@rm§s8 *   ÿ rmc Csdt t¡}t d¡}| t d¡¡ttdd„|Dƒƒƒ}t d¡}t d¡}|D]"}|  d|¡}||vrR|  |¡qR|D�]}z>|d}t t |ƒƒd }t j t j |¡d ¡}t |d d �} WntttfyÚYqzYn0t |d dd�} t |ddd�} t |ddd d�} | du�rBzt | ƒd } Wnt�y@d} Yn0| du�rvzt | ƒd } Wnt�ytd} Yn0||   | || | f¡qz|�s\t d¡}tt|ƒƒ}|D�]ª}z.z5/sys/devices/platform/coretemp.*/hwmon/hwmon*/temp*_*z'/sys/devices/platform/coretemp.*/hwmon/z/sys/class/hwmon/Ú_inputg@�@r‰F©r Z_maxNr÷Z_critÚ_labelr<©rŸr z /sys/class/thermal/thermal_zone*ZtempÚtypezignoring %r for file %rz /trip_point*cSs,g|]$}d tj |¡ d¡dd…¡‘qS)rÑrr")rÈrxr`rbrz)rµrõr?r?r@r¶%sÿÿZ_typeÚcriticalZ_tempÚhigh)Ú collectionsrrrêÚextendÚsortedrérárâÚsubr“rÕr¡rxr`rÈÚdirnamer›rœrßr Údict)r¯Ú basenamesZ basenames2Úreplr‰ZaltnameÚbaser`r®Ú unit_nameryrxÚlabelrÒZ trip_pathsZ trip_pointsZ trip_pointZ trip_typer?r?r@Úsensors_temperaturesÒs–  ÿ            $ÿ ÿ ÿ   r…c Csêt t¡}t d¡}|s"t d¡}ttdd„|Dƒƒƒ}|D]¤}ztt|dƒƒ}WnDtt fy˜}z(t   d|t ¡WYd}~q.rsz ignoring %rNr‰Frtrur<rv)rzrrrêr|rér½r¡r›rœrÉrÊrËrxr`rÈr~r“rZsfanr)r¯r€r‚r®rÒrƒr„r?r?r@Ú sensors_fansCs"   "ÿr†c sÚtƒ‰‡fdd„}dd„t t¡Dƒ}|s.dStj tt|ƒd¡}||d|dƒ}||d |d ƒ}||d |d ƒ}||d ƒ}|durÀ|durÀzd||}Wqàty¼d}Yqà0n tt |ddd�ƒ}|dkràdSd}|tj td¡tj td¡ƒ} | du�r| dk}n4t |dddd�  ¡} | dk�r.multi_catcSs&g|]}| d¡sd| ¡vr|‘qS)ZBATZbattery)r²ràr´r?r?r@r¶vs ÿz#sensors_battery..Nrz /energy_nowz /charge_nowz /power_nowz /current_nowz /energy_fullz /charge_fullz/time_to_empty_nowgY@r£z /capacityr6r÷z AC0/onlinez AC/onlinerz/statusr<FrvZ discharging)ZchargingZfullTié<)ÚobjectrxrÚPOWER_SUPPLY_PATHr`rÈr|ÚZeroDivisionErrorr½r¡ràrZPOWER_TIME_UNLIMITEDZPOWER_TIME_UNKNOWNZsbattery) rŠZbatsrdZ energy_nowZ power_nowZ energy_fullZ time_to_emptyrPZ power_pluggedZonliner9Zsecsleftr?r‰r@Úsensors_batterycsh þþþ     þ       r�c Cs\g}t ¡}|D]F}|\}}}}}}|s*q|dvr6d}t ||pBd|||¡} | | ¡q|S)z:Return currently connected users as a list of namedtuples.)z:0.0z:0Z localhostN)rÏÚusersrZsuserr“) rnZrawlistÚitemrpZttyÚhostnameZtstampZ user_processr«Úntr?r?r@r�Ás r�cCs„dtƒ}t|ƒ�^}|D]<}| d¡rt| ¡ ¡dƒ}|a|WdƒSqtd|ƒ‚Wdƒn1sv0YdS)zAReturn the system boot time expressed in seconds since the epoch.r‹sbtimerNzline 'btime' not found in %s)r rr²rÕršrzÚ BOOT_TIMEr0)r`r•rÁr¯r?r?r@Ú boot_timeÓs   ÿr•cCsdd„t ttƒƒ¡DƒS)z7Returns a list of PIDs currently running on the system.cSsg|]}| ¡rt|ƒ‘qSr?)r‡r½r´r?r?r@r¶èr·zpids..)rxrrr r?r?r?r@ræsrc Csºt |¡sdSz†dtƒ|f}t|ƒ�\}|D]:}| d¡r,t| ¡dƒ}||kWdƒWSq,td|ƒ‚Wdƒn1sˆ0YWn ttfy´|t ƒvYS0dS)zcCheck for the existence of a unix PID. Linux TIDs are not supported (always return False). Fú %s/%s/statussTgid:rNz'Tgid' line not found in %s) rÚ pid_existsr rr²r½rzrßÚEnvironmentErrorr)r«r`r•rÁZtgidr?r?r@r—ës    .r—c Cs i}tƒ}tƒD]Š}z.wrapper)Ú functoolsÚwraps)r¤r¥r?r£r@Úwrap_exceptions!s r¨c@sneZdZdZgd¢Zdd„Zdd„Zeedd„ƒƒZ eed d „ƒƒZ eed d „ƒƒZ d d„Z dd„Z edd„ƒZdd„Zedd„ƒZedd„ƒZedd„ƒZej de ¡¡r¼edd„ƒZedd„ƒZed d!„ƒZed\d#d$„ƒZed%d&„ƒZed'd(„ƒZe�r(ee d)¡e d*¡e d+¡fd,d-„ƒZ neZ e�r>ed.d/„ƒZ!ed0d1„ƒZ"ee d2¡fd3d4„ƒZ#ee d5¡fd6d7„ƒZ$ed8d9„ƒZ%ed:d;„ƒZ&edd?„ƒZ)e d@¡fdAdB„Z*edCdD„ƒZ+e,�rèedEdF„ƒZ-edGdH„ƒZ.e/d"u�red]dIdJ„ƒZ0edKdL„ƒZ1edMdN„ƒZ2ed^dPdQ„ƒZ3edRdS„ƒZ4edTdU„ƒZ5ee dV¡fdWdX„ƒZ6ee dY¡fdZd[„ƒZ7d"S)_ÚProcesszLinux process implementation.)r«r Ú_ppidrÚ_cachecCs||_d|_d|_tƒ|_dSr)r«r rªr r)rr«r?r?r@r;szProcess.__init__cCst d|j|jf¡dS)z+Raise NSP if the process disappeared on us.rŸN)rxr`rr«©rr?r?r@Ú _assert_aliveAszProcess._assert_alivecCsøtd|j|jfƒ�}| ¡}Wdƒn1s20Y| d¡}|| d¡d|…}||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. r™Nršó(rr:r‰rr9r�r#Úttynré Úutimeé Ústimeé Úchildren_utimerTÚchildren_stimeéÚ create_timeé$Úcpu_numé'Ú blkio_ticks)rrr«r™rHÚfindrz)rr•r›rœr‰r—r¯r?r?r@Ú_parse_stat_fileGs$ &           zProcess._parse_stat_filecCs@td|j|jfƒ�}| ¡WdƒS1s20YdS)z�Read /proc/{pid}/stat file and return its content. The return value is cached in case oneshot() ctx manager is in use. r–N)rrr«r™©rr•r?r?r@Ú_read_status_filejszProcess._read_status_filecCsHtd|j|jftd��}| ¡ ¡WdƒS1s:0YdS)Nz %s/%s/smapsr+)rrr«r.r™ršr¿r?r?r@Ú_read_smaps_filets ÿzProcess._read_smaps_filecCs(|j |¡|j |¡|j |¡dSr)r¾Zcache_activaterÀrÁr¬r?r?r@Ú oneshot_enter{s  zProcess.oneshot_entercCs(|j |¡|j |¡|j |¡dSr)r¾Zcache_deactivaterÀrÁr¬r?r?r@Ú oneshot_exit€s  zProcess.oneshot_exitcCs| ¡d}trt|ƒ}|S)Nr‰)r¾r!r )rr‰r?r?r@r‰…s z Process.namec Csšztd|j|jfƒWSttfyvtj d|j|jf¡rFYdSt|jƒs`t |j|j ƒ‚nt |j|j |j ƒ‚Yn t y”t|j|j ƒ‚Yn0dS)Nz %s/%s/exerŸr<)ryrr«rr rxr`Úlexistsr—rr rrªrr r¬r?r?r@Úexe�s  z Process.execCs td|j|jfƒ�}| ¡}Wdƒn1s20Y|sDgS| d¡rRdnd}| |¡rl|dd…}| |¡}|dkrœt|ƒdkrœd|vrœ| d¡}|S)Nz %s/%s/cmdlinerurmr6r)rrr«r™r{rzr’)rr•r›ÚsepÚcmdliner?r?r@rÇžs&    zProcess.cmdlinecCsDtd|j|jfƒ�}| ¡}Wdƒn1s20Yt|ƒS)Nz %s/%s/environ)rrr«r™r)rr•r›r?r?r@Úenviron·s&zProcess.environcCs<t| ¡dƒ}t ¡}z ||WSty6YdS0dS)Nr¯)r½r¾rZget_terminal_mapr¼)rZtty_nrr r?r?r@Úterminal½s   zProcess.terminalz /proc/%s/ioc Csd|j|jf}i}t|ƒ�\}|D]F}| ¡}|r"z| d¡\}}WntyZYq"Yq"0t|ƒ||<q"Wdƒn1s~0Y|s˜td|ƒ‚z,t|d|d|d|d|d|d ƒWSt �y}z"td |d ||fƒ‚WYd}~n d}~00dS) Nz%s/%s/ios: z%s file was emptyssyscrssyscws read_bytess write_bytessrcharswcharz1%r field was not found in %s; found fields are %rr) rr«rršrzrßr½r0rnr¼)rržr—r•rÁr‰rñrÒr?r?r@Ú io_countersÈs4   , ú ÿzProcess.io_counterscCsh| ¡}t|dƒt}t|dƒt}t|dƒt}t|dƒt}t|dƒt}t|||||ƒS)Nr±r³rµr¶r¼)r¾rÕrÖro)rr–r±r³rµr¶rtr?r?r@rØçszProcess.cpu_timescCst| ¡dƒS)zWhat CPU the process is on.rº©r½r¾r¬r?r?r@rºñszProcess.cpu_numNcCst |j||j¡Sr)rZwait_pidr«r )rÚtimeoutr?r?r@Úwaitösz Process.waitcCs&t| ¡dƒ}tptƒ}|t|S)Nr¸)rÕr¾r”r•rÖ)rÚctimeZbtr?r?r@r¸ús zProcess.create_timec Csttd|j|jfƒ�<}dd„| ¡ ¡dd…Dƒ\}}}}}}}Wdƒn1sV0Yt|||||||ƒS)Nz %s/%s/statmcSsg|]}t|ƒt‘qSr?)r½r¾r´r?r?r@r¶r·z'Process.memory_info..r;)rrr«r‘rzrd) rr•ZvmsrjrWÚtextÚlibr›Zdirtyr?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||||fŽS)NrÅ)rÑrÁrìrIr½Úfindallre) rZ _private_reZ_pss_reZ_swap_reZ basic_memZ smaps_datarfrgrhr?r?r@Úmemory_full_infos  zProcess.memory_full_infocCsRdd„}| ¡}|sgS| d¡}g}| d¡}|g}|||ƒD�] \}}| dd¡}z|\} } } } } }Wn(ty’|dg\} } } } } }Yn0|sžd}n2trªt|ƒ}| ¡}| d ¡rÐt|ƒsÐ|dd …}|  t| ƒt| ƒ||  d d¡|  d d¡|  d d¡|  dd¡|  dd¡|  dd¡|  dd¡|  dd¡|  dd¡|  dd¡f ¡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 ss¤i}|D]ˆ}| dd¡}|d d¡s@| ¡|fV| |¡qzt|dƒd||d<WqtyŽ|d d¡r~Yqn td|ƒ‚Yq0q| ¡|fVdS)NérrýrrÅsVmFlags:z#don't know how to interpret line %r)rzr{Úpopr“r½rßr²)rJÚ current_blockr›rÁr—r?r?r@Ú get_blocksEs   ÿz'Process.memory_maps..get_blocksó rNrÔr<z[anon]rvrwsRss:sSize:sPss:s Shared_Clean:s Shared_Dirty:sPrivate_Clean:sPrivate_Dirty:s Referenced:s Anonymous:sSwap:) rÁrzrÕrßr!r ršr{rr“r»)rr×r›rJríZ first_linerÖÚheaderZhfieldsr&ZpermsÚoffsetÚdevrr`r?r?r@Ú memory_maps<sL     ÿ ÿ           õ zProcess.memory_mapsc Cs^ztd|j|jfƒWSttfyXt|jƒsBt|j|jƒ‚nt|j|j|j ƒ‚Yn0dS)Nz %s/%s/cwd) ryrr«rr r—rr rrªr¬r?r?r@Úcwd€s  z Process.cwdsctxt_switches:\t(\d+)cCsL| ¡}| |¡}|s,td|j|jfƒ‚nt t|dƒt|dƒ¡SdS)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)rÀrÒrùrr«rZpctxswr½)rZ _ctxsw_rer›Zctxswr?r?r@Únum_ctx_switches‹s ÿþÿzProcess.num_ctx_switchessThreads:\t(\d+)cCs| ¡}t| |¡dƒS©Nr)rÀr½rÒ)rZ_num_threads_rer›r?r?r@Ú num_threads™szProcess.num_threadsc Cst d|j|jf¡}| ¡g}d}|D]Æ}d|j|j|f}z8t|ƒ�}| ¡ ¡}Wdƒn1sl0YWnty’d}Yq*Yn0||  d¡dd…}|  d¡}t |dƒt } t |d ƒt } t  t|ƒ| | ¡} | | ¡q*|rþ| ¡|S) Nz %s/%s/taskFz%s/%s/task/%s/statTršr:rÎr°r²)rxrrr«Úsortrr™ršrr½rzrÕrÖrZpthreadr½r“r­) rZ thread_idsrnÚ hit_enoentZ thread_idržr•Ústr–r±r³rpr?r?r@Úthreads¡s. ÿ .    zProcess.threadscCs t |j¡Sr)rOÚ getpriorityr«r¬r?r?r@Únice_get½szProcess.nice_getcCst |j|¡Sr)rOÚ setpriorityr«)rrñr?r?r@Únice_setÆszProcess.nice_setcCs t |j¡Sr)rÏr4r«r¬r?r?r@Úcpu_affinity_getÍszProcess.cpu_affinity_getsCpus_allowed_list:\t(\d+)-(\d+)cCsV| ¡}| |¡}|r@ttt|ddƒt|ddƒdƒƒSttttƒƒƒƒSdS)Nrr)rÀrÒrrør½r’rÛ)rÚ_rer›rãr?r?r@Ú_get_eligible_cpusÑs  *zProcess._get_eligible_cpusc Cs¬zt |j|¡Wn”ttfy¦}zxt|tƒs<|jtjkr�| ¡}t t t t ƒƒƒƒ}|D]4}||vrvtd||fƒ‚||vrZtd||fƒ‚qZ‚WYd}~n d}~00dS)Nz(invalid CPU number %r; choose between %sz0CPU number %r is not eligible; choose between %s) rÏZproc_cpu_affinity_setr«rœrßÚ isinstancer±rrëÚtuplerør’rÛ)rrÙrÒZ eligible_cpusZall_cpusZcpur?r?r@Úcpu_affinity_setÛs(ÿÿÿÿzProcess.cpu_affinity_setcCs,t |j¡\}}tdur t|ƒ}t ||¡Sr)rÏr3r«Úenumr;rZpionice©rZioclassrñr?r?r@Ú ionice_getñszProcess.ionice_getcCsP|dur d}|r(|ttfvr(td|ƒ‚|dks8|dkr@tdƒ‚t |j||¡S)Nrz%r ioclass accepts no valuer;zvalue not in 0-7 range)r'r$rßrÏZproc_ioprio_setr«rðr?r?r@Ú ionice_setøs zProcess.ionice_setc Cs¬|jdkrtdƒ‚zD|dur*t|j|ƒWSt|ƒdkrFtdt|ƒƒ‚t|j||ƒWnPty¦}z8|jtjkr�t|jƒr�t |j|j |j ƒ‚n‚WYd}~n d}~00dS)Nrz)can't use prlimit() against PID 0 processr:z4second argument must be a (soft, hard) tuple, got %s) r«rßr¤r’r@rœr±ZENOSYSr—rr rª)rr¬r­rÒr?r?r@Úrlimits   ÿÿzProcess.rlimitcCs$| ¡d}tr| ¡}t |d¡S)Nr9ú?)r¾r!r Ú PROC_STATUSESr»)rZletterr?r?r@r9s zProcess.statusc Csvg}t d|j|jf¡}d}|D�]>}d|j|j|f}z t|ƒ}WnZttfydd}Yq"Yq"ty }z&|jtj krŠWYd}~q"‚WYd}~q"d}~00|  d¡r"t |ƒr"d|j|j|f}zXt |ƒ�:}t | ¡ ¡dƒ} t | ¡ ¡ddƒ} Wdƒn1�s0YWnt�y6d}Yq"0t| ƒ} t|t |ƒt | ƒ| | ƒ} | | ¡q"|�rr| ¡|S) NrFrTr…z%s/%s/fdinfo/%srr�)rxrrr«ryrr rœr±rr²rrr½r‘rzr„r_r“r­) rrnrerârar3r`rÒr•Úposrcrbrpr?r?r@Ú open_files&s@     ÿ : ÿ zProcess.open_filesrcCst ||j¡}| ¡|Sr)rErBr«r­)rrAr¯r?r?r@Ú connectionsRszProcess.connectionscCstt d|j|jf¡ƒS)Nr)r’rxrrr«r¬r?r?r@Únum_fdsXszProcess.num_fdscCst| ¡dƒS)Nr�rËr¬r?r?r@r�\sz Process.ppidsUid:\t(\d+)\t(\d+)\t(\d+)cCs6| ¡}| |¡d\}}}t t|ƒt|ƒt|ƒ¡Srß)rÀrÒrZpuidsr½)rZ_uids_rer›ÚrealÚ effectiveÚsavedr?r?r@Úuids`sz Process.uidssGid:\t(\d+)\t(\d+)\t(\d+)cCs6| ¡}| |¡d\}}}t t|ƒt|ƒt|ƒ¡Srß)rÀrÒrZpgidsr½)rZ_gids_rer›rúrûrür?r?r@Úgidsfsz Process.gids)N)N)r)8r<r=r>rCÚ __slots__rr­r¨rr¾rÀrÁrÂrÃr‰rÅrÇrÈrÉrxr`rôÚgetpidrÊrØrºrÍr¸rÑÚ HAS_SMAPSrárârÓrÜrÝrÞràrärærèÚHAS_CPU_AFFINITYrérërîÚHAS_PROC_IO_PRIORITYrñròr¤rór9r÷rørùr�rýrþr?r?r?r@r©6s² !            û C ÿ     ÿ       +   r©)N)r)F)F)¤rCZ __future__rr"rzr±r¦rêrxrár r#ÚsysÚ tracebackrÉrrr<rrrrÏr rOr r r r rrrrrrrrrrrrrrZ_compatrrrrr r!Ú version_inforïZ__extra__all__r�r`rôrrÚhasattrrrrŒr�rÞrÖZ getpagesizer¾r”r.Ú byteorderr!rgZ AF_PACKETr9ÚIntEnumr½r8r$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_PARKEDrõr(r)r*r+r,r-r.r/r0r1r2r1rMrYr_rdr×rerirÈrlrnroryr„rŠr˜r¡Ú ExceptionÚ print_excr�r¤ÚresourceÚ ImportErrorr§ZCDLLr©r{ÚdirrÃrÍrÓrØrÛræròrórüZ net_if_addrsrþrÿrErFrMrQÚ disk_usagerirmr…r†r�r�r•rr—ržr¨r©r?r?r?r@Úsb                                       ÿ ôõÿÿÿ þÿÿ       ÿ 4z:* ÿ   k % _ +q ^