U í·€gÞZã@sJdZddlmZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlmZddlmZddlmZddlmZdd lmZdd lmZdd lmZdd lmZdd lmZddlmZddlmZddlmZddlmZddlmZddlmZddlm Z ddlm!Z!ddlm"Z"ddlm#Z#ddlm$Z$ddlm%Z%ddlm&Z&ddlm'Z'ddlm(Z(ddlm)Z)ddlm*Z*ddl+m,Z,dd l+m-Z-dd!l+m.Z.dd"l+m/Z/dd#l+m0Z0dd$l+m1Z1e,røddl2Z2ndZ2d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4gZ3d5Z4ej5 6d6e 7¡¡Z8ej5 6d7e 7¡¡Z9e:ed8ƒZ;e:ed9ƒZe ?¡Z@daAe jBd;kZCdeHe jEƒi¡ZIeIjFZFe2dkrÎdZJdZKd?ZLd@ZMn GdAdB„dBe2jGƒZNeOƒ PeNjQ¡ejRejSejTejUejVejWejXejXejYejZej[ej\dCœ Z]ej^ej_ej`ejaejbejcejdejeejfejgejhdDœ ZiedEdFdGdHdIdJdKdLdMdNdOdPg ƒZjedQdRdSdTdUdVdWdXdYdZg ƒZked[d\d]d^d_d`gƒZledadbƒZmedcemjnddƒZoeded\dfdgdhdidjdkdldmdndog ƒZpedpdqdr qepjn¡ƒZredsdRdSdTdUdtdugƒZsedvdwdxdydzd{gƒZtd|d}„Zud~d„Zvd€d„Zwe#d‚dƒ„ƒZxz exd„ƒWnBeyk r’Zzz"ed…ezƒed†d‡ƒdˆdˆdˆƒa{W5dZz[zXYnXdZ|zdd‰l}m|Z|WnBe~k rêddlZej€ddŠd‹Ze:edŒƒrædÍddŒ„Z|YnXe|dk re3 ‚dŽd„eƒeƒDƒ¡dd‘„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Œej5 6d¢¡srej5 6d£¡r|d¤d¥„Znd¦d¥„ZejŽZŽGd§d¨„d¨eyƒZGd©dª„dªƒZeƒZ‘dÎd¬d­„Z’d®d¯„Z“d°d±„Z”ej•Z•dÏd³d´„Z–Gdµd¶„d¶ƒZ—dÐd·d¸„Z˜d¹dº„Z™d»d¼„Zšd½d¾„Z›d¿dÀ„ZœdÁd„ZdÃdÄ„ZždÅdÆ„ZŸdÇdÈ„Z dÉdÊ„Z¡GdËdÌ„d̃Z¢dS)ÑzLinux platform implementation.é)ÚdivisionN)Ú defaultdict)Ú namedtupleé)Ú_common)Ú_psposix)Ú _psutil_linux)Ú _psutil_posix)ÚNIC_DUPLEX_FULL)ÚNIC_DUPLEX_HALF)ÚNIC_DUPLEX_UNKNOWN)Ú AccessDenied)Ú NoSuchProcess)Ú ZombieProcess)Úbcat)Úcat)Údebug)Údecode)Úget_procfs_path)Ú isfile_strict)Úmemoize)Úmemoize_when_activated)Ú open_binary)Ú open_text)Úparse_environ_block)Úpath_exists_strict)Ú supports_ipv6)Ú usage_percent)ÚPY3)ÚFileNotFoundError)ÚPermissionError)ÚProcessLookupError)Úb)Ú basestringZ 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/smapsz/proc/%s/smaps_rollupÚproc_ioprio_getÚproc_cpu_affinity_getÚ SC_CLK_TCKÚlittleiÚ AddressFamilyÚAF_LINKééc@seZdZdZdZdZdZdS)Ú IOPriorityrrr9r:N)Ú__name__Ú __module__Ú __qualname__r$r%r&r'©r?r?ú?/opt/hc_python/lib64/python3.8/site-packages/psutil/_pslinux.pyr;ysr;) Ú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ÚsdiskioZ read_countZ write_countÚ read_bytesÚ write_bytesZ read_timeZ write_timeZread_merged_countZwrite_merged_countÚ busy_timeÚ popenfileÚpathÚfdÚpositionÚmodeÚflagsÚpmemz"rss vms shared text lib data dirtyÚpfullmem)ÚussÚpssÚswapÚ pmmap_groupedÚrssÚsizerfZ shared_cleanZ shared_dirtyZ private_cleanZ private_dirtyZ referencedZ anonymousrgÚ pmmap_extz addr perms ú ÚpioZ read_charsZ write_charsÚ pcputimesÚuserÚsystemÚ children_userÚchildren_systemÚiowaitcCsLt|tƒst|ƒ‚t |¡}| d¡d}| d¡rHt|ƒsH|dd…}|S)zWrapper around os.readlink().úrú (deleted)Néöÿÿÿ)Ú isinstancer#ÚAssertionErrorÚosÚreadlinkÚsplitÚendswithr)r^r?r?r@rzÔs   rzcCsXtjdtjdtjdi}||tjtjBtjB@}|tj@rH| ddd¡}| dd¡}|S)zZConvert file's open() flags into a readable string. Used by Process.open_files(). ÚrÚwzw+Úarzr+)ryÚO_RDONLYÚO_WRONLYÚO_RDWRÚO_APPENDÚreplace)rbZ modes_maprar?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„ryÚaccessÚF_OK)ÚnameZincluding_virtualr^r?r?r@Úis_storage_deviceõs  r‹c CsŠtd|ƒ}| ¡ ¡dd…}W5QRXdddddd d g}t|ƒ}|d krX| d ¡|d krj| d¡|dkr|| 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/statrNroÚnicerpZidlersZirqZsoftirqéZstealé Zguesté Z guest_niceÚ scputimes)rÚreadliner{ÚlenÚappendrr‘)Ú procfs_pathÚfÚvaluesÚfieldsZvlenr?r?r@Úset_scputimes_ntuples    r™ú/procz ignoring exception on import: %rr‘zuser system idleç)ÚprlimitT)Z use_errnorœcCsšGdd„dtjƒ}|ƒ}|dkr8t ||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@Ú StructRlimit>sþr rr) rŸZ StructureÚlibcrœZbyrefrržZ get_errnoÚOSErrorryÚstrerror)ÚpidÚ resource_Úlimitsr ÚcurrentÚretÚnewZerrno_r?r?r@rœ=s"  ÿcCs"g|]}| d¡r| ¡r|‘qS)ZRLIM)Ú startswithÚisupper©Ú.0rHr?r?r@Ú Ys r®c Cs2|d}|| dd¡}z|d}|d}|d}Wn<tk rp}ztd|jdƒ|WY¢Sd}~XYnXztd tƒƒ}Wntk rœ|YSXd}|6|D]*} |  ¡} |  d ¡r¬|t |   ¡d ƒ7}q¬W5QRX|t 9}||} ||} | t | d |ƒ8} | | 7} | |t |d |ƒ7} t | ƒS)ayFallback for kernels < 3.14 where /proc/meminfo does not provide "MemAvailable", 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 We use this function also when "MemAvailable" returns 0 (possibly a kernel bug, see: https://github.com/giampaolo/psutil/issues/1915). In that case this routine matches "free" CLI tool result ("available" column). XXX: on recent kernels this calculation may differ by ~1.5% compared to "MemAvailable:", as it's calculated slightly differently. It is still way more realistic than doing (free + cached) though. See: * https://gitlab.com/procps-ng/procps/issues/42 * https://github.com/famzah/linux-memavailable-procfs/issues/2 óMemFree:óCached:rs Active(file):sInactive(file):ó SReclaimable:zY%s is missing from /proc/meminfo; using an approximation for calculating available memoryNz %s/zoneinfoslowrr9g@) ÚgetÚKeyErrorrÚargsrrÚIOErrorÚstriprªÚintr{ÚPAGESIZEÚmin) ÚmemsrRÚfallbackZlru_active_fileZlru_inactive_fileZslab_reclaimableÚerrr–Z watermark_lowÚlineÚavailZ pagecacher?r?r@Úcalculate_avail_vmembs< þÿ   r¿c CsÒg}i}tdtƒƒ0}|D]$}| ¡}t|dƒd||d<qW5QRX|d}|d}z |d}Wn"tk rŠd}| d¡YnXz |d }Wn"tk rºd}| d ¡YnX|| d d¡7}z |d } WnHtk r z |d } Wn$tk rd} | d¡YnXYnXz |d} Wn$tk rRd} | d¡YnXz |d} WnXtk r¸z|d|d|d} Wn$tk r²d} | d¡YnXYnXz |d} Wntk ràd} YnX||||} | dkr||} z |d}Wntk r.t|ƒ}YnX|dkrBt|ƒ}|dkr\d}| d¡n||krj|}t|||dd}|r¶dd  |¡t |ƒdkrždndf}t j |t ddt|||| || | ||| | ƒ S) a7Report virtual memory stats. This implementation mimics procps-ng-3.3.12, aka "free" CLI tool: https://gitlab.com/procps-ng/procps/blob/ 24fd2605c51fccc375ab0287cec33aa767f06718/proc/sysinfo.c#L778-791 The returned values are supposed to match both "free" and "vmstat -s" CLI tools. ú %s/meminforérs 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ú, ÚwasÚwerer9©Ú stacklevel)rrr{r·r³r”r²r¿rÚjoinr“ÚwarningsÚwarnÚRuntimeWarningrM)Zmissing_fieldsrºr–r½r˜rNrRrUrVrWrSrTrXrQr¾rPÚmsgr?r?r@Úvirtual_memory¢s¦$      ÿþÿ         þõrÍc CsÒi}tdtƒƒ0}|D]$}| ¡}t|dƒd||d<qW5QRXz|d}|d}Wn:tk r–t ¡\}}}}}}}||9}||9}YnX||}t||dd} ztdtƒƒ}WnLtk r } z,d d t | ƒ} t j | t d d d} } W5d } ~ XYn²X|¦d } } |D]n}|  d¡rLt| d¡dƒdd} n&|  d¡rrt| d¡dƒdd} | d k r | d k r q´q d } | d7} t j | t d d d} } W5QRXt |||| | | ¡S)zReturn swap memory metrics.rÀrrÁrs SwapTotal:s SwapFree:rÂz %s/vmstatz,'sin' and 'sout' swap memory stats couldn't z$be determined and were set to 0 (%s)r9rÆNspswpinó éspswpoutzbe determined and were set to 0)rrr{r·r³ÚcextZ linux_sysinforrµÚstrrÉrÊrËrªrZsswap)rºr–r½r˜rNrRÚ_Zunit_multiplierrQrPr¼rÌÚsinZsoutr?r?r@Ú swap_memory'sJ$  ÿÿ   rÔc Cs^tƒ}t|ƒtd|ƒ}| ¡ ¡}W5QRX|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ŒrcSsg|]}t|ƒt‘qSr?©ÚfloatÚ CLOCK_TICKSr¬r?r?r@r®oszcpu_times..)rr™rr’r{r“r‘Ú_fields)r•r–r—r˜r?r?r@Ú cpu_timescsrÙc Cs”tƒ}t|ƒg}td|ƒl}| ¡|D]L}| d¡r,| ¡}|dttjƒd…}dd„|Dƒ}t|Ž}|  |¡q,|W5QR£SQRXdS)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®sz!per_cpu_times..N) rr™rr’rªr{r“r‘rØr”)r•Úcpusr–r½r—r˜Úentryr?r?r@Ú per_cpu_timesss  rÜc CsÌz t d¡WStk rÆd}tdtƒƒ&}|D]}| ¡ d¡r4|d7}q4W5QRX|dkr°t d¡}t dtƒƒ0}|D]$}|  d¡d}|  |¡r€|d7}q€W5QRX|dkr¾Yd S|YSXd S) z0Return the number of logical CPUs in the system.ÚSC_NPROCESSORS_ONLNrú %s/cpuinfos processorrzcpu\drŒrlN) ryÚsysconfÚ ValueErrorrrÚlowerrªÚreÚcompilerr{Úmatch)Únumr–r½Úsearchr?r?r@Úcpu_count_logical‡s$   rçc Cs tƒ}d}d}t |¡p t |¡D]*}t|ƒ}| | ¡ ¡¡W5QRXq"t|ƒ}|dkrb|Si}i}tdtƒƒv}|D]j}| ¡ ¡}|sÂz|d||d<Wnt k rºYnXi}q~|  d¡r~|  dd ¡\} } t | ƒ|| <q~W5QRXt | ¡ƒ}|pd S) z-Return the number of CPU 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)rérès :rN)ÚsetÚglobrÚaddÚreadr¶r“rrár³rªr{r·Úsumr—) ÚlsÚp1Zp2r^r–ÚresultÚmappingZ current_infor½ÚkeyÚvaluer?r?r@Úcpu_count_cores¤s6  ÿ  rõc Cs²tdtƒƒŠ}d}d}d}|D]r}| d¡r@t| ¡dƒ}n6| d¡r\t| ¡dƒ}n| d¡rvt| ¡dƒ}|dk r |dk r |dk r q”q W5QRXd}t ||||¡S)z*Return various CPU stats as a named tuple.rŒNsctxtrsintrssoftirqr)rrrªr·r{rZ scpustats)r–Z ctx_switchesZ interruptsZsoft_interruptsr½Zsyscallsr?r?r@Ú cpu_statsÎs2   ÿþýÿröc CsTg}tdtƒƒ8}|D],}| ¡ d¡r| t| dd¡dƒ¡qW5QRX|S)z7Return current CPU frequency from cpuinfo if available.rÞscpu mhzó:r)rrrárªr”rÖr{)r¨r–r½r?r?r@Ú_cpu_get_cpuinfo_freqçs &røz'/sys/devices/system/cpu/cpufreq/policy0z$/sys/devices/system/cpu/cpu0/cpufreqc Cs&tƒ}t d¡pt d¡}|jdd„dg}tjj}t|ƒD]â\}}t|ƒt|ƒkrd||d}nt||dƒdd }|dkrÔt||d ƒdd }|dkrÔd   |¡}t |dd d krÈ|  t   d d d ¡¡q>d}t|ƒ‚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. z,/sys/devices/system/cpu/cpufreq/policy[0-9]*z)/sys/devices/system/cpu/cpu[0-9]*/cpufreqcSstt d|¡ ¡ƒS)Nz[0-9]+)r·râræÚgroup)rHr?r?r@Úþózcpu_freq..)róièZscaling_cur_freqN©r»Zcpuinfo_cur_freqz$/sys/devices/system/cpu/cpu{}/onlinez0 r›z!can't find current frequency fileZscaling_max_freqZscaling_min_freq)rørëÚsortryr^rÈÚ enumerater“rÚformatrr”rÚscpufreqÚNotImplementedErrorr·) Z cpuinfo_freqsÚpathsr¨ÚpjoinÚir^ÚcurrZ online_pathrÌZmax_Zmin_r?r?r@Úcpu_freqõs8ÿþÿ rcCsdd„tƒDƒS)z}Alternate implementation using /proc/cpuinfo. min and max frequencies are not available and are set to None. cSsg|]}t |dd¡‘qS)r›)rrr¬r?r?r@r®"szcpu_freq..)rør?r?r?r@rsc@s eZdZdS)Ú_Ipv6UnsupportedErrorN)r<r=r>r?r?r?r@r-src@sZeZdZdZdd„Zdd„Zdd„Zedd „ƒZedd d „ƒZ edd d„ƒZ ddd„Z d S)ÚNetConnectionsawA 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 Útcp4r r Úudp4r r ÚinetZinet4Zinet6)ÚsocketÚAF_INETÚ SOCK_STREAMÚAF_INET6Ú SOCK_DGRAMÚAF_UNIXÚtmapÚ _procfs_path)Úselfrr rr r r?r?r@Ú__init__=s$   õ zNetConnections.__init__c Csâttƒ}t d|j|f¡D]À}ztd|j||fƒ}Wnnttfk rTYqYqtk r¦}z6|j t j krxWY¢$q|j t j kr”t |ƒWY¢q‚W5d}~XYqX|  d¡r|dd…dd…}|| |t|ƒf¡q|S)Nú%s/%s/fdú %s/%s/fd/%szsocket:[rŽéÿÿÿÿ)rÚlistryÚlistdirrrzrr!r¢ÚerrnoÚEINVALÚ ENAMETOOLONGrrªr”r·)rr¤Úinodesr_Úinoder¼r?r?r@Úget_proc_inodesTs"   zNetConnections.get_proc_inodesc CsHi}tƒD]8}z| | |¡¡Wq tttfk r@Yq Yq Xq |S©N)ÚpidsÚupdater&rr!r )rr$r¤r?r?r@Úget_all_inodesns  zNetConnections.get_all_inodesc Csò| d¡\}}t|dƒ}|s dStr.| d¡}|tjkrntrZt |t  |¡ddd…¡}qæt |t  |¡¡}nxt  |¡}zJtr t tj t j d t   d|¡žŽ¡}n t tj t j d t   d|¡žŽ¡}Wn"tk rätƒsÞt‚n‚YnXt ||¡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?ÚasciiNrú>4Iú<4I)r.)r/)r{r·rÚencoderrÚ LITTLE_ENDIANÚ inet_ntopÚbase64Ú b16decoderÚstructÚpackÚunpackràrrrÚaddr)r8ÚfamilyÚipÚportr?r?r@Údecode_address~s4    þþzNetConnections.decode_addressNc cs<| d¡rtj |¡sdSt|ƒ}| ¡t|dƒD]ô\}}z(| ¡dd…\ }} } } }}}}}} Wn&tk rŽt d|||fƒ‚YnX| |krª|| d\} }nd\} }|dk rÆ|| krÆq8q8|t j krÚt | } nt j} zt | |¡} t | |¡} Wntk rYq8YnX|||| | | | fVq8W5QRXdS)z.Parse /proc/net/tcp* and /proc/net/udp* files.Ú6Nrrz,error while parsing %s; malformed line %s %rr©Nr)r|ryr^Úexistsrr’rþr{ràÚ RuntimeErrorrrÚ TCP_STATUSESrÚ CONN_NONErr<r)Úfiler9Útype_r$Ú filter_pidr–Úlinenor½rÒÚladdrÚraddrÚstatusr%r¤r_r?r?r@Ú process_inet³s8 ÿÿÿ     zNetConnections.process_inetc cst|ƒî}| ¡|D]Ú}| ¡}z|dd…\}}}}}}} Wn0tk rpd|kr\Yqtd||fƒ‚YnX| |kr„|| } ndg} | D]`\} } |dk rª|| krªqŽqŽt|ƒdkr¾|dnd } t t|ƒ¡}d }tj }| ||| ||| fVqŽqW5QRXdS) zParse /proc/net/unix files.rérlz)error while parsing %s; malformed line %rr>NrŽrÚ) rr’r{ràr@r“rZsocktype_to_enumr·rB)rCr9r$rEr–r½ÚtokensrÒrDr%Úpairsr¤r_r^rHrIr?r?r@Ú process_unixÝs2 ÿÿ   zNetConnections.process_unixc Cs||jkr,td|d dd„|jDƒ¡fƒ‚tƒ|_|dk rP| |¡}|sXgSn| ¡}tƒ}|j|D]¢\}}}d|j|f}|tj tj hkr¦|j |||||d} n|j ||||d} | D]L\} }}} } } }|rèt  | ||| | | ¡}nt  | ||| | | |¡}| |¡q¼qht|ƒS)Nz+invalid %r kind argument; choose between %srÃcSsg|] }t|ƒ‘qSr?)Úreprr¬r?r?r@r®sz+NetConnections.retrieve..z %s/net/%s)rE)rràrÈrrr&r*rêrrrrJrOrÚpconnZsconnrìr)rÚkindr¤r$r¨Z proto_namer9rDr^rïr_rGrHrIZ bound_pidÚconnr?r?r@ÚretrievesZ ÿÿ ÿÿÿzNetConnections.retrieve)N)N)N) r<r=r>Ú__doc__rr&r*Ú staticmethodr<rJrOrTr?r?r?r@r1s  4 ) #rrcCs t |¡S)z$Return system-wide open connections.)Ú_net_connectionsrT)rRr?r?r@Únet_connections(srXcCsÄtdtƒƒ}| ¡}W5QRXi}|dd…D]Œ}| d¡}|dksTtt|ƒƒ‚|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/devr9Nr+rr) rrÚ readlinesÚrfindrxrPr¶r{Úmapr·)r–ÚlinesÚretdictr½ÚcolonrŠr˜Z bytes_recvZ packets_recvZerrinZdropinZ_fifoinZ_frameinZ _compressedinZ _multicastinZ bytes_sentZ packets_sentZerroutZdropoutZ_fifooutZ_collisionsoutZ _carrieroutZ_compressedoutr?r?r@Únet_io_counters-sH íø r_c CsÀtjttjttjti}tƒ ¡}i}|D]’}z&t   |¡}t   |¡}t  |¡\}}Wn:t k rŒ}z|jtjkrt‚nt|ƒW5d}~XYq(Xd |¡} d|k} t | ||||| ¡||<q(|S)z)Get NIC stats (isup, duplex, speed, mtu).Nú,Úrunning)rÐZ DUPLEX_FULLr Z DUPLEX_HALFr ZDUPLEX_UNKNOWNr r_ÚkeysÚ cext_posixZ net_if_mtuZ net_if_flagsZnet_if_duplex_speedr¢r!ZENODEVrrÈrZ snicstats) Z duplex_mapÚnamesr¨rŠZmturbZduplexÚspeedr¼Z output_flagsZisupr?r?r@Ú net_if_stats\s8ý     ÿ rfFc 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 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/diskstatsér:r9rÏéérKrz!not sure how to interpret line %r)rrrYr{r“r·r[rà)r–r\r½r˜ZflenrŠÚreadsÚ reads_mergedÚrbytesÚrtimeÚwritesÚ writes_mergedÚwbytesÚwtimerÒr\r?r?r@Ú read_procfs†sH  ÿ ÿÿÿ  ÿz%disk_io_counters..read_procfsc ss¸t d¡D]¨}t tj d|¡¡D]Ž\}}}d|kr6q"ttj |d¡ƒ}| ¡ ¡ ¡}W5QRXtj  |¡}t t |dd…ƒ\ }}} } } } } }}}||| | | | ||| |f Vq"q dS)Nú /sys/blockÚstatr) ryr Úwalkr^rÈrrír¶r{Úbasenamer[r·)ÚblockÚrootrÒÚfilesr–r˜rŠrkrlrmrnrorprqrrr\r?r?r@Ú read_sysfs³s& ÿ ÿz$disk_io_counters..read_sysfsrgrtzC%s/diskstats nor /sys/block filesystem are available on this system)ryr^r?rrr‹ÚDISK_SECTOR_SIZE)Zperdiskrsr{Úgenr]rÛrŠrkrormrqrnrrrlrpr\r?r?r@Údisk_io_counterss6- þÿÿ  ÿ r~c@s@eZdZdZddgZdd„Zdd„Zdd „Zd d „Zd d „Z dS)ÚRootFsDeviceFinderaFdisk_partitions() may return partitions with device == "/dev/root" or "rootfs". This container class uses different strategies to try to obtain the real device path. Resources: https://bootlin.com/blog/find-root-device/ https://www.systutorials.com/how-to-find-the-disk-where-root-is-on-in-bash-on-linux/. ÚmajorÚminorcCs(t d¡j}t |¡|_t |¡|_dS)Nr†)ryruÚst_devr€r)rÚdevr?r?r@rós  zRootFsDeviceFinder.__init__c Csºtdtƒƒ¢}| ¡dd…D]Š}| ¡}t|ƒdkr:q |d ¡rRt|dƒnd}|d ¡rnt|dƒnd}|d}||jkr ||jkr |r d|W5QR£Sq W5QRXdS)Nz %s/partitionsr9rÏrrr:ú/dev/%s) rrrYr{r“Úisdigitr·r€r)rr–r½r˜r€rrŠr?r?r@Úask_proc_partitionsøs z&RootFsDeviceFinder.ask_proc_partitionsc Csjd|j|jf}t|ƒH}|D]<}| d¡r| ¡ d¡d}|rd|W5QR£SqW5QRXdS)Nz/sys/dev/block/%s:%s/ueventzDEVNAME=r9r„)r€rrrªr¶Ú rpartition)rr^r–r½rŠr?r?r@Úask_sys_dev_blocks  z$RootFsDeviceFinder.ask_sys_dev_blockc Csžd|j|jf}t d¡}|D]z}z t|ƒ}Wntk rFYqYqX|F| ¡ ¡}||krŽtj   tj   |¡¡}d|W5QR£SW5QRXqdS)Nz%s:%sz/sys/class/block/*/devr„) r€rrëÚiglobrrrír¶ryr^rwÚdirname)rÚneedlerzrCr–ÚdatarŠr?r?r@Úask_sys_class_blocks    z&RootFsDeviceFinder.ask_sys_class_blockc Csìd}|dkrHz | ¡}Wn.ttfk rF}z t|ƒW5d}~XYnX|dkrŒz | ¡}Wn.ttfk rŠ}z t|ƒW5d}~XYnX|dkrÐz | ¡}Wn.ttfk rÎ}z t|ƒW5d}~XYnX|dk rètj |¡rè|SdSr') r†rµr¢rrˆrryr^r?)rr^r¼r?r?r@Úfinds$   zRootFsDeviceFinder.findN) r<r=r>rUÚ __slots__rr†rˆrrŽr?r?r?r@rés  rc Cstƒ}tƒ}|sttd|ƒR}|D]F}| ¡}| d¡sH| | ¡¡q"| d¡d}|dkr"| d¡q"W5QRX|dkr–tj  d¡r–tj  d¡}ntj  d|¡}g}t   |¡}|D]^} | \} } }} | d krÔd } | d krêt ƒ ¡pè| } |sü| r¸||krüq¸t | | || ¡} | | ¡q¸|S) z8Return mounted disk partitions as a list of namedtuples.z%s/filesystemsZnodevú rZzfsršz /etc/mtabz%s/self/mountsÚnonerL>Úrootfsú /dev/root)rêrrr¶rªrìr{ryr^ÚisfileÚrealpathrÐÚdisk_partitionsrrŽrZ sdiskpartr”)rZfstypesr•r–r½ZfstypeZ mounts_pathÚretlistZ partitionsÚ partitionZdeviceZ mountpointÚoptsÚntupler?r?r@r–4s8     r–c Csdt t¡}t d¡}| t d¡¡ttdd„|Dƒƒƒ}t d¡}t d¡}|D]"}|  d|¡}||krR|  |¡qR|D]}z>|d}t t |ƒƒd }t j t j |¡d ¡}t|ƒ ¡} Wntttfk rÜYqzYnXt |d d d } t |dd d } t|ddd  ¡} | d k rHzt | ƒd } Wntk rFd } YnX| d k r~zt | ƒd } Wntk r|d } YnX||   | || | 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ŠÚ_maxNrüZ_critÚ_labelrLz /sys/class/thermal/thermal_zone*ÚtempÚtypez /trip_point*cSs,g|]$}d tj |¡ d¡dd…¡‘qS)rÒrr:)rÈryr^rwr{)r­Úpr?r?r@r®´sÿÚ_typeÚcriticalÚ_tempÚhigh)Ú collectionsrrrëÚextendÚsortedrêrârãÚsubr”rÖrryr^rÈrŠrr¶rµr¢ràrÚdict)r¨Ú basenamesZ basenames2ÚreplrŠZaltnameÚbaser^r§Ú unit_namer¦r¤Ú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ƒƒ}Wn6tt fk rŠ}zt |ƒWY¢q.rNrŠrŸrLrü)r§rrrër©rêr·rrµr¢rrryr^rÈrŠr¶r”rZsfanr«)r¨r¬r®r§r¼r¯r°r?r?r@Ú sensors_fansÖs   r²c sàtƒ‰‡fdd„}dd„t t¡Dƒ}|s.dStj tt|ƒd¡}||d|dƒ}||d |d ƒ}||d |d ƒ}||d ƒ}|dk rÂ|dk rÂzd||}Wqâtk r¾d}YqâXn tt |dddƒ}|dkrâdSd}|tj td¡tj td¡ƒ} | dk r| dk}n6t |ddd  ¡  ¡} | dkr@d}n| dkrNd}|r\t j } nv|dk r¤|dk r¤zt||dƒ} Wntk r t j} YnXn.|dk rÌt|dƒ} | dkrÒt 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. c sR|D]H}t|ˆd}|ˆkrzt|ƒWStk rJ| ¡YSXqdS)zvAttempt to read the content of multiple files which may not exist. If none of them exist return None. rüN)rr·ràr¶)rr^r¨©Únullr?r@Ú multi_bcatþs z#sensors_battery..multi_bcatcSs&g|]}| d¡sd| ¡kr|‘qS)ZBATÚbattery)rªrár¬r?r?r@r® s þz#sensors_battery..Nrz /energy_nowz /charge_nowz /power_nowz /current_nowz /energy_fullz /charge_fullz/time_to_empty_nowgY@r›z /capacityrrüz AC0/onlinez AC/onlinerz/statusrLZ dischargingF>ÚchargingÚfullTié<)Úobjectryr ÚPOWER_SUPPLY_PATHr^rÈr©ÚZeroDivisionErrorr·rr¶rárZPOWER_TIME_UNLIMITEDZPOWER_TIME_UNKNOWNZsbattery) rµZbatsryZ energy_nowZ power_nowZ energy_fullZ time_to_emptyrPZ power_pluggedZonlinerIZsecsleftr?r³r@Úsensors_batteryõsZ þ    þ       r½c CsHg}t ¡}|D]2}|\}}}}}t ||p.d|||¡}| |¡q|S)z:Return currently connected users as a list of namedtuples.N)rÐÚusersrZsuserr”) r—ZrawlistÚitemroÚttyÚhostnameZtstampr¤Úntr?r?r@r¾Ts r¾c Csndtƒ}t|ƒR}|D]:}| d¡rt| ¡ ¡dƒ}|a|W5QR£Sqtd|ƒ‚W5QRXdS)zAReturn the system boot time expressed in seconds since the epoch.rŒsbtimerzline 'btime' not found in %sN)rrrªrÖr¶r{Ú BOOT_TIMEr@)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®sszpids..)ryr r"rr?r?r?r@r(qsr(c Cs¦t |¡sdSzpdtƒ|f}t|ƒP}|D]8}| d¡r,t| ¡dƒ}||kW5QR£WSq,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_existsrrrªr·r{ràÚEnvironmentErrorr()r¤r^r–r½Ztgidr?r?r@rÆvs    rÆc CsŽi}tƒ}tƒD]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ó)r9Nr) rr(rrírr!rZr{r·)r¨r•r¤r–rŒÚrparZdsetÚppidr?r?r@Úppid_map–s    rÌcst ˆ¡‡fdd„ƒ}|S)zlDecorator which translates bare OSError and IOError exceptions into NoSuchProcess and AccessDenied. cs¤zˆ|f|ž|ŽWStk r4t|j|jƒ‚Ynltk r\| ¡t|j|jƒ‚YnDtk rž| ¡tj   d|j |jf¡s˜t|j|jƒ‚‚YnXdS)NrÈ) r r r¤Ú_namer!Ú_raise_if_zombierrryr^r?r)rr´Úkwargs©Úfunr?r@Úwrapper±sÿz wrap_exceptions..wrapper)Ú functoolsÚwraps)rÑrÒr?rÐr@Úwrap_exceptions¬srÕc@s¢eZdZdZdddddgZdd„Zd d „Zd d „Zd d„Ze e dd„ƒƒZ e e dd„ƒƒZ e e dd„ƒƒZ dd„Zdd„Ze dd„ƒZe dd„ƒZe dd„ƒZe dd „ƒZe d!d"„ƒZej d#e ¡¡rÖe d$d%„ƒZe d&d'„ƒZe d(d)„ƒZe dhd+d,„ƒZe d-d.„ƒZe d/d0„ƒZes e r\d1d2„Z!e e" #d3¡e" #d4¡e" #d5¡fd6d7„ƒZ$e d8d9„ƒZ%neZ%e rre d:d;„ƒZ&e d¡fd?d@„ƒZ(e e" #dA¡fdBdC„ƒZ)e dDdE„ƒZ*e dFdG„ƒZ+e dHdI„ƒZ,e-rþe dJdK„ƒZ.e" #dL¡fdMdN„Z/e dOdP„ƒZ0e1re dQdR„ƒZ2e dSdT„ƒZ3e4d*k r4e didUdV„ƒZ5e dWdX„ƒZ6e dYdZ„ƒZ7e djd\d]„ƒZ8e d^d_„ƒZ9e d`da„ƒZ:e e" #db¡fdcdd„ƒZ;e e" #de¡fdfdg„ƒZt| ¡dƒ}t ¡}z ||WStk r8YdSXdS)Nrß)r·rîrZget_terminal_mapr³)rZtty_nrrr?r?r@Úterminalcs  zProcess.terminalz /proc/%s/ioc Csòd|j|jf}i}t|ƒT}|D]H}| ¡}|r"z| d¡\}}Wntk r\Yq"Yq"Xt|ƒ||<q"W5QRX|s†td|ƒ‚z,t|d|d|d|d|d|d ƒWSt k rì}ztd |j d ||fƒ‚W5d}~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) rr¤rr¶r{ràr·r@rmr³r´)rÚfnamer˜r–r½rŠrôr¼r?r?r@Ú io_countersos8   úÿÿ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×rn)rr—rárãrårærsr?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 Cs`td|j|jfƒ2}dd„| ¡ ¡dd…Dƒ\}}}}}}}W5QRXt|||||||ƒS)Nz %s/%s/statmcss|]}t|ƒtVqdSr')r·r¸r¬r?r?r@Ú ¼sz&Process.memory_info..rK)rrr¤r’r{rc) rr–ZvmsrirWÚtextÚlibrŒZdirtyr?r?r@Ú memory_info®s ÿzProcess.memory_infoc Cs¢d}}}td |j|j¡ƒr}|D]f}| d¡rN|t| ¡dƒd7}q&| d¡rnt| ¡dƒd}q&| d¡r&t| ¡dƒd}q&W5QRX|||fS)Nrz{}/{}/smaps_rollupsPrivate_rrÁóPss:óSwap:)rrÿrr¤rªr·r{)rrerfrgr–r½r?r?r@Ú_parse_smaps_rollupÃs ÿ    zProcess._parse_smaps_rollups\nPrivate.*:\s+(\d+)s\nPss\:\s+(\d+)s\nSwap\:\s+(\d+)cCsZ| ¡}ttt| |¡ƒƒd}ttt| |¡ƒƒd}ttt| |¡ƒƒd}|||fS)NrÁ)rñrîr[r·Úfindall)rZ _private_reZ_pss_reZ_swap_reZ smaps_datarerfrgr?r?r@Ú _parse_smapsÚs zProcess._parse_smapsc Cshtr@z| ¡\}}}WqNttfk r<| ¡\}}}YqNXn| ¡\}}}| ¡}t||||fŽSr')ÚHAS_PROC_SMAPS_ROLLUPrr!rrrrd)rrerfrgZ basic_memr?r?r@Úmemory_full_infoùszProcess.memory_full_infocCs`dd„}| ¡}|s | ¡gS| d¡}g}| d¡}|g}|||ƒD]\}}| dd¡}z|\} } } } } }Wn*tk rœ|dg\} } } } } }YnX|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 }|  |¡qH|S)aQReturn 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<Wqtk r|d d¡r€Yqn td|ƒ‚YqXq| ¡|fVdS)Nérr÷rrÁsVmFlags:z#don't know how to interpret line %r)r{r|Úpopr”r·ràrª)r\Ú current_blockrŒr½r˜r?r?r@Ú get_blockss"  ÿÿ z'Process.memory_maps..get_blocksó rNr rLz[anon]rurvsRss:sSize:rs Shared_Clean:s Shared_Dirty:sPrivate_Clean:sPrivate_Dirty:s Referenced:s Anonymous:r) rñrÎr{r ràrrr¶r|rr²r”)rrrŒr\rïÚ first_liner ÚheaderZhfieldsr8ZpermsÚ_offsetÚ_devZ_inoder^r¿r?r?r@Ú memory_maps sP     ÿ           ó zProcess.memory_mapscCstd|j|jfƒS)Nz %s/%s/cwd)rzrr¤rÛr?r?r@ÚcwdVsz 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ðrrrr¤rZpctxswr·)rZ _ctxsw_rerŒZctxswr?r?r@Únum_ctx_switchesZs  þÿzProcess.num_ctx_switchessThreads:\t(\d+)cCs| ¡}t| |¡dƒS©Nr)rðr·r)rZ_num_threads_rerŒr?r?r@Ú num_threadsiszProcess.num_threadsc Csôt d|j|jf¡}| ¡g}d}|D]¸}d|j|j|f}z$t|ƒ}| ¡ ¡}W5QRXWn tt fk r„d}Yq*YnX||  d¡dd…}|  d¡}t |dƒt } t |d ƒt } t t|ƒ| | ¡} | | ¡q*|rð| ¡|S) Nz %s/%s/taskFz%s/%s/task/%s/statTrÉr9rÎràrâ)ryr rr¤rýrrír¶rr!rŽr{rÖr×rZpthreadr·r”rÝ) rZ thread_idsr—Ú hit_enoentZ thread_idrúr–Ústr—rárãršr?r?r@Úthreadsqs2ý    zProcess.threadscCs t |j¡Sr')rcÚ getpriorityr¤rÛr?r?r@Únice_getszProcess.nice_getcCst |j|¡Sr')rcÚ 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ðrrÚranger·r“rÜ)rÚ_rerŒrär?r?r@Ú_get_eligible_cpus¤s  *zProcess._get_eligible_cpusc Csªzt |j|¡Wn’ttfk r¤}zpt|tƒs>|jtjkr’| ¡}t t t t ƒƒƒƒ}|D]4}||krxtd||fƒ‚||kr\td||fƒ‚q\‚W5d}~XYnXdS)Nz(invalid CPU number %r; choose between %sz0CPU number %r is not eligible; choose between %s) rÐZproc_cpu_affinity_setr¤r¢ràrwr!r"r#Útupler!r“rÜ)rrÚr¼Z eligible_cpusZall_cpusÚcpur?r?r@Úcpu_affinity_set¯s(ÿÿÿÿzProcess.cpu_affinity_setcCs,t |j¡\}}tdk r t|ƒ}t ||¡Sr')rÐr3r¤Úenumr;rZpionice)rÚioclassrôr?r?r@Ú ionice_getÇszProcess.ionice_getcCsT|dkr d}|r(|tthkr(td|ƒ‚|dks8|dkrDd}t|ƒ‚t |j||¡S)Nrz%r ioclass accepts no valuerKzvalue not in 0-7 range)r'r$ràrÐZproc_ioprio_setr¤)rr(rôrÌr?r?r@Ú ionice_setÎs zProcess.ionice_setc Cs |jdkrd}t|ƒ‚zL|dkr.t|j|ƒWSt|ƒdkrRddt|ƒ}t|ƒ‚t|j||ƒWn8tk rš}z|jtjkrˆ| ¡‚W5d}~XYnXdS)Nrz)can't use prlimit() against PID 0 processr9z'second argument must be a (soft, hard) z tuple, got %s) r¤ràrœr“rPr¢r!ZENOSYSrÎ)rr¥r¦rÌr¼r?r?r@ÚrlimitÛs"   ÿÿ zProcess.rlimitcCs$| ¡d}tr| ¡}t |d¡S)NrIú?)rîrrÚ PROC_STATUSESr²)rÚletterr?r?r@rI÷s zProcess.statusc Cs~g}t d|j|jf¡}d}|D]F}d|j|j|f}z t|ƒ}Wnrttfk rfd}Yq"Yq"tk r¸}z6|jtj krŠWY¢$q"|jtj kr¦t |ƒWY¢q"‚W5d}~XYq"X|  d¡r"t |ƒr"d|j|j|f}zBt|ƒ0}t| ¡ ¡dƒ} t| ¡ ¡ddƒ} W5QRXWnttfk r>d}Yq"Xt| ƒ} t|t|ƒt| ƒ| | ƒ} | | ¡q"|rz| ¡|S) NrFrTr†z%s/%s/fdinfo/%srrŽ)ryr rr¤rzrr!r¢r!r"r#rrªrrr·r’r{r…r]r”rÝ) rr—rzrr_rCr^r¼r–Úposrbraršr?r?r@Ú open_filesÿsR    ý $ ÿ zProcess.open_filesrcCst ||j¡}| ¡|Sr')rWrTr¤rÝ)rrRr¨r?r?r@rX3 szProcess.net_connectionscCstt d|j|jf¡ƒS)Nr)r“ryr rr¤rÛr?r?r@Únum_fds9 szProcess.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ðrrZpuidsr·)rZ_uids_rerŒÚrealÚ effectiveÚsavedr?r?r@ÚuidsA sz Process.uidssGid:\t(\d+)\t(\d+)\t(\d+)cCs6| ¡}| |¡d\}}}t t|ƒt|ƒt|ƒ¡Sr)rðrrZpgidsr·)rZ_gids_rerŒr2r3r4r?r?r@ÚgidsG sz Process.gids)N)N)r)=r<r=r>rUrrrÚrÎrÝrÕrrîrðrñròrórŠrõr÷rørùryr^r?ÚgetpidrûrÙrêrþrèrr ÚHAS_PROC_SMAPSrrârãrr rrrrrrrÚHAS_CPU_AFFINITYr r#r&ÚHAS_PROC_IO_PRIORITYr)r*rœr+rIr0rXr1rËr5r6r?r?r?r@rÖÈs¾ %              û   K ÿ     ÿ       3   rÖ)N)r)F)F)£rUÚ __future__rr3r§r!rÓrëryrârr5ÚsysrÉrrrLrrrrÐr rcr r r r rrrrrrrrrrrrrrrrZ_compatrrr r!r"r#r'Z__extra__all__r»r^r?r7r8r Úhasattrr:r9rßr×Z getpagesizer¸rÃÚ byteorderr1r|Ú AF_PACKETr8ÚIntEnumr·r7r$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/r0r1r2rArMrYr]rcrØrdrhrÈrkrmrnrzr…r‹r™Ú Exceptionr¼r‘rœÚresourceÚ ImportErrorrŸÚCDLLr¡r¨Údirr¿rÍrÔrÙrÜrçrõrörørZ net_if_addrsrrrWrXr_rfÚ disk_usager~rr–r±r²r½r¾rÄr(rÆrÌrÕrÖr?r?r?r@ÚsÄ                                  ø      ÿ ôõ ÿÿüÿ ÿ  ÿþÿþÿÿ     $   ÿ @<* ÿ ) u /" hK ,v_