U Ã|ýfIYã@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?úB/opt/alt/python38/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ÚnicerpÚidlersZirqZsoftirqé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_errnorcCsš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ÚlibcrZbyrefržrŸ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Úp1Úp2r^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 .sr c@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 Úudp4rrÚinetZinet4Zinet6)ÚsocketÚAF_INETÚ SOCK_STREAMÚAF_INET6Ú SOCK_DGRAMÚAF_UNIXÚtmapÚ _procfs_path)Úselfrr rrrr?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_inodesUs"   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_inodesos  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)r0)r1)r{r¸rÚencoderrÚ LITTLE_ENDIANÚ inet_ntopÚbase64Ú b16decoderÚstructÚpackÚunpackrárr rÚaddr)r:ÚfamilyÚipÚportr?r?r@Údecode_addresss4    þþ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.Ú6Nrr‘z,error while parsing %s; malformed line %s %rr©Nr )r|ryr^Úexistsrr“rr{ráÚ RuntimeErrorrrÚ TCP_STATUSESrÚ CONN_NONEr r>r )Úfiler;Ú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@Nrr Ú) rr“r{rárBr”rZsocktype_to_enumr¸rD)rEr;r&rGr—r¾ÚtokensrÓrFr'Úpairsr¥r_r^rJrKr?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 fkr¦|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)rG)rrárÉrrr(r,rërrrrLrQrÚpconnZsconnrír!)rÚkindr¥r&r©Z proto_namer;rFr^rðr_rIrJrKZ bound_pidÚconnr?r?r@ÚretrievesZ ÿÿ ÿÿÿzNetConnections.retrieve)N)N)N) r<r=r>Ú__doc__rr(r,Ú staticmethodr>rLrQrVr?r?r?r@r 2s  4 ) #r rcCs t |¡S)z$Return system-wide open connections.)Ú_net_connectionsrV)rTr?r?r@Únet_connections)srZcCsÄ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ÚrfindrxrRr·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 íø rac 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 raÚ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ý     ÿ rhFc 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ÐéérMrz!not sure how to interpret line %r)rrr[r{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Šrmrnrorprqrrrsrtr\r?r?r@Ú read_sysfs´s& ÿ ÿz$disk_io_counters..read_sysfsrirvzC%s/diskstats nor /sys/block filesystem are available on this system)ryr^rArrr‹ÚDISK_SECTOR_SIZE)Zperdiskrur}Úgenr_rÜrŠrmrqrorsrprtrnrrr\r?r?r@Údisk_io_counters‚s6- þÿÿ  ÿ 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†)ryrwÚ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) rrr[r{r”Úisdigitr¸r‚rƒ)rr—r¾r™r‚rƒrŠ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‚rƒrr«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‚rƒrìÚiglobrrrîr·ryr^ryÚdirname)rÚneedler|rEr—Ú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^rA)rr^r½r?r?r@Úfinds$   zRootFsDeviceFinder.findN) r<r=r>rWÚ __slots__rrˆrŠrrr?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ÚnonerN)z /dev/rootZrootfs)rërrr·r«rír{ryr^ÚisfileÚrealpathrÑÚdisk_partitionsrrrZ sdiskpartr•)rZfstypesr–r—r¾ZfstypeZ mounts_pathÚretlistZ partitionsÚ partitionZdeviceZ mountpointÚoptsÚntupler?r?r@r–5s8     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Ú_labelrNz /sys/class/thermal/thermal_zone*ÚtempÚtypez /trip_point*cSs,g|]$}d tj |¡ d¡dd…¡‘qS)rÓrr:)rÉryr^ryr{)r®Úpr?r?r@r¯µsÿÚ_typeÚcriticalÚ_tempÚhigh)Ú collectionsrr!rìÚ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_temperaturesasš  ÿ            þ ÿ ÿ   r±c CsÞt t¡}t d¡}|s"t d¡}ttdd„|Dƒƒƒ}|D]˜}ztt|dƒƒ}Wn6tt fk rŠ}zt |ƒWY¢q.rNrŠrŸrNrþ)r§rr!rì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 /capacityr rþz AC0/onlinez AC/onlinerz/statusrNZ dischargingF)ZchargingÚfullTié<)Úobjectryr"ÚPOWER_SUPPLY_PATHr^rÉr©ÚZeroDivisionErrorr¸rr·rârZPOWER_TIME_UNLIMITEDZPOWER_TIME_UNKNOWNZsbattery) rµZbatsr{Z energy_nowZ power_nowZ energy_fullZ time_to_emptyrPZ power_pluggedZonlinerKZsecsleftr?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½Us 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_TIMErB)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¯tszpids..)ryr"r"rr?r?r?r@r*rsr*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Åws    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!r\r{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)Nú%s/%s) r r r¥Ú_namer!Ú_raise_if_zombierrryr^rAr)rrµÚkwargs©Úfunr?r@Úwrapper²sz 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@ÚterminalZs  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¸rBrmr´rµ)rÚfnamer™r—r¾rŠrör½r?r?r@Ú io_countersfs8   úÿÿ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..rM)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:)rrrr¥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_blocks s"  ÿÿ z'Process.memory_maps..get_blocksó rNr rNz[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•)rr rŽr^rðÚ first_liner ÚheaderZhfieldsr:ZpermsÚ_offsetÚ_devZ_inoder^r¾r?r?r@Ú memory_mapssP     ÿ           ó zProcess.memory_mapscCstd|j|jfƒS)Nz %s/%s/cwd)rzrr¥rÛr?r?r@ÚcwdMsz 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_switchesQs  þÿ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 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!rr{r×rØrZpthreadr¸r•rÜ) rZ thread_idsr—Ú hit_enoentÚ thread_idrør—Ústr˜ràrâršr?r?r@Úthreadshs2ý    zProcess.threadscCs t |j¡Sr))reÚ getpriorityr¥rÛr?r?r@Únice_get‡szProcess.nice_getcCst |j|¡Sr))reÚ setpriorityr¥)rrör?r?r@Únice_setszProcess.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(|ttfkr(td|ƒ‚|dks8|dkrDd}t|ƒ‚t |j||¡S)Nrz%r ioclass accepts no valuerMzvalue 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árr”rRr£r#ZENOSYSrÎ)rr¦r§rÍr½r?r?r@ÚrlimitÒs"   ÿÿ zProcess.rlimitcCs$| ¡d}tr| ¡}t |d¡S)NrKú?)rìrrÚ PROC_STATUSESr³)rÚletterr?r?r@rKî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—r|rr_rEr^r½r—Úposrbraršr?r?r@Ú open_filesösR    ý $ ÿ zProcess.open_filesrcCst ||j¡}| ¡|Sr))rYrVr¥rÜ)rrTr©r?r?r@rZ* szProcess.net_connectionscCstt d|j|jf¡ƒS)Nr)r”ryr"rr¥rÛr?r?r@Únum_fds0 szProcess.num_fdscCst| ¡dƒS)NrÊrúrÛr?r?r@rÊ4 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@Úuids8 sz Process.uidssGid:\t(\d+)\t(\d+)\t(\d+)cCs6| ¡}| |¡d\}}}t t|ƒt|ƒt|ƒ¡Sr)rîrrZpgidsr¸)rZ_gids_rerŽr1r2r3r?r?r@Úgids> sz Process.gids)N)N)r)=r<r=r>rWr‘rrÚrÎrÜrÕrrìrîrïrðrñrŠrórõrör÷ryr^rAÚgetpidrùrÚrérürçrrÚHAS_PROC_SMAPSrrãrärrrrrrrrrÚHAS_CPU_AFFINITYrr"r%ÚHAS_PROC_IO_PRIORITYr(r)rr*rKr/rZr0rÊr4r5r?r?r?r@rÖÄs¾               û   K ÿ     ÿ       3   rÖ)N)r)F)F)£rWÚ __future__rr5r§r#rÓrìryrãrr7ÚsysrÊrrrNrrrrÑr rer r r r rrrrrrrrrrrrrrrrZ_compatrrr r!r"r#r&Z__extra__all__rºr^rAr6r7rÚhasattrr9r8ràrØZ getpagesizer¹rÂÚ byteorderr3r~Ú 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/r0r1r2rCrMrYr]rcrÙrdrhrÉrkrmrnrzr…r‹ršÚ Exceptionr½r’rÚresourceÚ ImportErrorr ÚCDLLr¢r¨ÚdirrÀrÎrÕrÚrÝrèr÷rørúrZ net_if_addrsr r rYrZrarhÚ disk_usager€rr–r±r²r¼r½rÃr*rÅrËrÕrÖr?r?r?r@ÚsÄ                                  ø      ÿ ôõ ÿÿüÿ ÿ  ÿþÿþÿÿ     $   ÿ @<+ ÿ ) u /" hK ,v_