B Œ=Ý_µ@ã@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#krîddl2Z2ndZ2d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3gZ3d4Z4ej5 6d5e 7¡¡Z8e9ed6ƒZ:e9ed7ƒZ;e<ƒZ=e >d8¡Z?e @¡ZAdaBe0rhd9nd:ZCe jDd;kZEdeJe jGƒi¡ZKeKjHZHe2dkrÄdZLdZMd?ZNd@ZOn GdAdB„dBe2jIƒZPeQƒ RePjS¡ejTejUejVejWejXejYejZejZej[ej\ej]ej^dCœ Z_ej`ejaejbejcejdejeejfejgejhejiejjdDœ ZkedEdFdGdHdIdJdKdLdMdNdOdPg ƒZledQdRdSdTdUdVdWdXdYdZg ƒZmed[d\d]d^d_d`gƒZnedadbƒZoedceojpddƒZqeded\dfdgdhdidjdkdldmdndog ƒZredpdqdr serjp¡ƒZtedsdRdSdTdUdtdugƒZuedvdwdxdydzd{gƒZvd|d}„Zwd~d„Zxd€d„Zyed‚dƒ„ƒZze=d„fd…d†„Z{y ezd‡ƒWn0e|k r„e  }¡edˆd‰ƒdŠdŠdŠƒa~YnXdZydd‹l€mZWnBek rÜddl‚Z‚e‚jƒdd„dŒZ„e9e„dƒrØdÌdŽd„ZYnXedk re3 …dd„e†eƒDƒ¡d‘d’„Z‡d“d”„Zˆd•d–„Z‰d—d˜„ZŠd™dš„Z‹d›dœ„ZŒddž„ZdŸd „ZŽej5 6d¡¡s\ej5 6d¢¡rfd£d¤„Zn ej5 6d¥¡r~d¦d¤„Znd§d¤„ZejZGd¨d©„d©e|ƒZ‘Gdªd«„d«ƒZ’e’ƒZ“dÍd­d®„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¿„ZdÀ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?úB/opt/alt/python37/lib64/python3.7/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ÚsdiskioZ read_countZ write_countZ read_bytesZ 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ÚrssÚsizercZ shared_cleanZ shared_dirtyZ private_cleanZ private_dirtyZ referencedZ anonymousrdÚ 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().úrz (deleted)Niöÿÿÿ)Ú isinstancerÚAssertionErrorÚosÚreadlinkÚsplitÚendswithr)r\r?r?r@ruÐs   rucCsXtjdtjdtjdi}||tjtjBtjB@}|tj@rH| ddd¡}| dd¡}|S)zZConvert file's open() flags into a readable string. Used by Process.open_files(). ÚrÚwzw+Úarzr+)rtÚO_RDONLYÚO_WRONLYÚO_RDWRÚO_APPENDÚreplace)r_Z modes_mapr^r?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)rrtÚaccessÚF_OK)ÚnameZincluding_virtualr\r?r?r@Úis_storage_deviceñs  r†c CsŠtd|ƒ}| ¡ ¡dd…}WdQRXdddddd 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. z%s/statrNrlÚnicermZidlerpZirqZsoftirqéZstealé Zguesté Z guest_niceÚ scputimes)rÚreadlinervÚlenÚappendrr‹)Ú procfs_pathÚfÚvaluesÚfieldsZvlenr?r?r@Úset_scputimes_ntuples    r“Tc CsXy,|rt|ƒnt|ƒ}| ¡ ¡SQRXWn&ttfk rR|tk rL|S‚YnXdS)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Úbinaryrr?r?r@Úcatsrœz/procr‹zuser system idleg)Úprlimit)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@Ú StructRlimitJsr¡rr) r Z StructureÚlibcrZbyrefržrŸZ get_errnor—rtÚstrerror)ÚpidÚ resource_Úlimitsr¡ÚcurrentÚretÚnewÚerrnor?r?r@rIs  cCs"g|]}| d¡r| ¡r|‘qS)ZRLIM)Ú startswithÚisupper)Ú.0rHr?r?r@ú bsr®c Cs |d}|| dd¡}y|d}|d}|d}Wntk rH|SXytdtƒƒ}Wntk rp|SXd}|:x2|D]*}| ¡}| d¡r‚|t| ¡d ƒ7}q‚WWd QRX|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. sMemFree:sCached:rs Active(file):sInactive(file):s SReclaimable:z %s/zoneinfoslowrNr:g@) ÚgetÚKeyErrorrr r–r•r«ÚintrvÚPAGESIZEÚmin) ÚmemsrRršZlru_active_fileZlru_inactive_fileZslab_reclaimablerZ watermark_lowÚlineÚavailZ pagecacher?r?r@Úcalculate_avail_vmemjs2   "r·c Cs¾g}i}tdtƒƒ4}x,|D]$}| ¡}t|dƒd||d<qWWdQRX|d}|d}y |d}Wn"tk rŽd}| d ¡YnXy |d }Wn"tk r¾d}| d ¡YnX|| d d¡7}y |d } WnHtk r$y |d} Wn$tk rd} | d¡YnXYnXy |d} Wn$tk rVd} | d¡YnXy |d} WnXtk r¼y|d|d|d} Wn$tk r¶d} | d¡YnXYnXy |d} Wntk räd} YnX||||} | dkr||} y |d}Wntk r2t|ƒ}YnX|dkrLd}| d¡||krZ|}t|||dd}|r¢dd  |¡t |ƒdkrŽ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". z %s/meminforirNs MemTotal:sMemFree:sBuffers:rUsCached:rVs SReclaimable:sShmem:s MemShared:rWsActive:rSs Inactive:s Inact_dirty:s Inact_clean:sInact_laundry:rTsSlab:s MemAvailable:rO)Úround_z6%s memory stats couldn't be determined and %s set to 0z, ZwasZwere)rr rvr±r°rŽr¯r·rÚjoinrÚwarningsÚwarnÚRuntimeWarningrM)Zmissing_fieldsr´rrµr’rNrRrUrVrWrSrTrXrQr¶rPÚmsgr?r?r@Úvirtual_memoryžs‚ &                r¾c CsÂi}tdtƒƒ4}x,|D]$}| ¡}t|dƒd||d<qWWdQRXy|d}|d}Wn:tk ršt ¡\}}}}}}}||9}||9}YnX||}t||dd} ytd tƒƒ}WnDtk r} z$d t | ƒ} t   | t ¡d} } Wdd} ~ XYn¦X|šd} } xŠ|D]j}|  d ¡rJt| d ¡dƒd d} n&|  d¡rpt| d ¡dƒd d} | dk r| dk rPqWd} t   | t ¡d} } WdQRXt |||| | | ¡S)zReturn swap memory metrics.z %s/meminforirNs 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 rvr±r°ÚcextZ linux_sysinforr–Ústrrºr»r¼r«rZsswap)r´rrµr’rNrRÚ_Zunit_multiplierrQrPÚerrr½ZsinZsoutr?r?r@Ú swap_memorysD &       rÄc Cs^tƒ}t|ƒtd|ƒ}| ¡ ¡}WdQRX|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. z%s/statNrcSsg|]}t|ƒt‘qSr?)ÚfloatÚ CLOCK_TICKS)r­rHr?r?r@r®^szcpu_times..)r r“rrŒrvrr‹Ú_fields)rrr‘r’r?r?r@Ú cpu_timesRsrÈc CsŒtƒ}t|ƒg}td|ƒd}| ¡xT|D]L}| d¡r.| ¡}|dttjƒd…}dd„|Dƒ}t|Ž}|  |¡q.W|SQRXdS)zfReturn a list of namedtuple representing the CPU times for every CPU available on the system. z%s/statscpurcSsg|]}t|ƒt‘qSr?)rÅrÆ)r­rHr?r?r@r®psz!per_cpu_times..N) r r“rrŒr«rvrr‹rÇrŽ)rÚcpusrrµr‘r’Úentryr?r?r@Ú per_cpu_timesbs  rËc CsÌy t d¡Stk rÆd}tdtƒƒ*}x"|D]}| ¡ d¡r4|d7}q4WWdQRX|dkr¶t d¡}t dtƒƒ4}x,|D]$}|  d ¡d}|  |¡r„|d7}q„WWdQRX|dkrÂdS|SXdS) z0Return the number of logical CPUs in the system.ÚSC_NPROCESSORS_ONLNrz %s/cpuinfos processorrNzcpu\dz%s/statri) rtÚsysconfÚ ValueErrorrr Úlowerr«ÚreÚcompilerrvÚmatch)ÚnumrrµÚsearchr?r?r@Úcpu_count_logicalvs$     rÕc Cstƒ}d}d}xBt |¡p"t |¡D]*}t|ƒ}| | ¡ ¡¡WdQRXq$Wt|ƒ}|dkrf|Si}i}tdtƒƒz}xr|D]j}| ¡ ¡}|sÈy|d||d<Wnt k rÀYnXi}q„|  d¡r„|  d d ¡\} } t | ƒ|| <q„WWdQRXt | ¡ƒ}|pdS) 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_listNrz %s/cpuinfos cpu coress physical id)s physical ids cpu coress :r)ÚsetÚglobrÚaddr”r•rr rÏr°r«rvr±Úsumr‘) ÚlsZp1Zp2r\rÚresultÚmappingZ current_inforµÚkeyÚvaluer?r?r@Úcpu_count_physical“s2      rßc Cs´tdtƒƒŒ}d}d}d}xx|D]p}| d¡rBt| ¡dƒ}n6| d¡r^t| ¡dƒ}n| d¡rxt| ¡dƒ}|dk r"|dk r"|dk r"Pq"WWdQRXd}t ||||¡S)z*Return various CPU stats as a named tuple.z%s/statNsctxtrsintrssoftirqr)rr r«r±rvrZ scpustats)rZ 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}x°ttƒƒD]¢}||ƒ}|s*qtjj}t||dƒdd}|dkrnt||dƒdd}|dkrntdƒ‚t|ƒd}tt||d ƒƒƒd}tt||d ƒƒƒd}| t   |||¡¡qW|S) z‚Return frequency metrics for all CPUs. Contrarily to other OSes, Linux updates these values in real-time. cSs.x(d|d|fD]}tj |¡r|SqWdS)Nz(/sys/devices/system/cpu/cpufreq/policy%sz%/sys/devices/system/cpu/cpu%s/cpufreq)rtr\Ú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Õrtr\r¹rœÚNotImplementedErrorr±rŽrÚscpufreq)rãr¨Únr\ZpjoinZcurrZmax_Zmin_r?r?r@Úcpu_freqÔs$ rèz /proc/cpuinfoc Csfg}tdtƒƒJ}xB|D]:}| ¡ d¡r| dd¡\}}| t t|ƒdd¡¡qWWdQRX|S)z}Alternate implementation using /proc/cpuinfo. min and max frequencies are not available and are set to None. z %s/cpuinfoscpu mhzó:rgN) rr rÏr«rvrŽrrærÅ)r¨rrµrÝrÞr?r?r@rèõs &cCsgS)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ìÚtcp4rírîÚudp4rïrðÚinetZinet4Zinet6)ÚsocketÚAF_INETÚ SOCK_STREAMÚAF_INET6Z SOCK_DGRAMZAF_UNIXÚtmapÚ _procfs_path)Úselfròrírórïrðr?r?r@Ú__init__ s"   zConnections.__init__c CsÂttƒ}x´t d|j|f¡D]œ}ytd|j||fƒ}WnJttfk rTwYqtk r„}z|j t j krrw‚Wdd}~XYqX|  d¡r|dd…dd…}||  |t |ƒf¡qW|S)Nz%s/%s/fdz %s/%s/fd/%szsocket:[rˆr6)rÚlistrtÚlistdirrúrurr r—rªÚEINVALr«rŽr±)rûr¤Úinodesr]ÚinoderÃr?r?r@Úget_proc_inodes7s  zConnections.get_proc_inodesc CsJi}x@tƒD]6}y| | |¡¡Wq tttfk r@w Yq Xq W|S)N)ÚpidsÚupdaterrr r)rûrr¤r?r?r@Úget_all_inodesMs  zConnections.get_all_inodesc Csò| d¡\}}t|dƒ}|s dStr.| d¡}|tjkrntrZt |t  |¡ddd…¡}qæt |t  |¡¡}nxt  |¡}yJtr 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?ÚasciiNr6ú>4Iú<4I)r )r )rvr±r!ÚencoderõröÚ LITTLE_ENDIANZ inet_ntopÚbase64Z b16decoderøÚstructÚpackÚunpackrÎrrêrÚaddr)rÚfamilyZipZportr?r?r@Údecode_address]s0    zConnections.decode_addressNc csD| d¡rtj |¡sdSt|td}| ¡xt|dƒD]ò\}}y(| ¡dd…\ }} } } }}}}}} Wn&t k r–t d|||fƒ‚YnX| |kr²|| d\} }nd\} }|dk rÎ|| krÎq@q@|t j krât | } ntj} yt | |¡} t | |¡} Wntk rw@YnX|||| | | | fVq@WWdQRXdS) z.Parse /proc/net/tcp* and /proc/net/udp* files.Ú6N)Ú bufferingrrŠz,error while parsing %s; malformed line %s %rr)Nr6)rwrtr\rárÚBIGFILE_BUFFERINGrŒÚ enumeratervrÎÚ RuntimeErrorrõr÷Ú TCP_STATUSESrÚ CONN_NONErërrê)ÚfilerÚtype_rÚ filter_pidrÚlinenorµrÂÚladdrÚraddrÚstatusrr¤r]r?r?r@Ú process_inets2(   zConnections.process_inetc cs t|tdö}| ¡xæ|D]Þ}| ¡}y|dd…\}}}}}}} Wn.tk rtd|kr`wtd||fƒ‚YnX| |krˆ|| } ndg} xj| D]b\} } |dk r°|| kr°q”q”t|ƒdkrÆ|d } nd } t t |ƒ¡}d }tj }| ||| ||| fVq”WqWWdQRXdS) zParse /proc/net/unix files.)rrériz)error while parsing %s; malformed line %r)Nr6Nrˆr6Ú) rrrŒrvrÎrrrZsocktype_to_enumr±r)rrrrrrµÚtokensrÂrrZpairsr¤r]r\r r!r?r?r@Ú process_unix¸s2    zConnections.process_unixc Cs||jkr,td|d dd„|jDƒ¡fƒ‚tƒ|_|dk rP| |¡}|sXgSn| ¡}tƒ}x´|j|D]¦\}}}d|j|f}|tj tj fkr¨|j |||||d} n|j ||||d} xT| D]L\} }}} } } }|rìt  | ||| | | ¡}nt  | ||| | | |¡}| |¡qÀWqjWt|ƒS)Nz+invalid %r kind argument; choose between %sz, cSsg|] }t|ƒ‘qSr?)Úrepr)r­rHr?r?r@r®ász(Connections.retrieve..z %s/net/%s)r)rùrÎr¹r rúrrrÖrõrörør"r&rZpconnZsconnrØrý)rûÚkindr¤rr¨Z proto_namerrr\rÚr]rr r!Z bound_pidZconnr?r?r@ÚretrieveÞs2  zConnections.retrieve)N)N)N) r<r=r>Ú__doc__rürrÚ staticmethodrr"r&r)r?r?r?r@rës  3 ' %rërôcCs t |¡S)z$Return system-wide open connections.)Ú _connectionsr))r(r?r?r@Únet_connectionssr-cCsÈtdtƒƒ}| ¡}WdQRXi}xœ|dd…D]Œ}| d¡}|dksVtt|ƒƒ‚|d|… ¡}||dd… ¡ ¡}tt |ƒ\}}} } } } } }}}}}}}}}||||| || |f||<q4W|S)zsReturn network I/O statistics for every network interface installed on the system as a dict of raw tuples. z %s/net/devNr:rrr) rr Ú readlinesÚrfindrsr'r•rvÚmapr±)rÚlinesÚretdictrµZcolonr…r’Z bytes_recvZ packets_recvZerrinZdropinZfifoinZframeinZ compressedinZ multicastinZ bytes_sentZ packets_sentZerroutZdropoutZfifooutZ collisionsoutZ carrieroutZ compressedoutr?r?r@Únet_io_counterss *r3c Cs¦tjttjttjti}tƒ ¡}i}x||D]t}y&t   |¡}t   |¡}t  |¡\}}Wn0t k r„}z|jtjkrt‚Wdd}~XYq*Xt |||||¡||<q*W|S)z)Get NIC stats (isup, duplex, speed, mtu).N)rÀZ DUPLEX_FULLrZ DUPLEX_HALFrZDUPLEX_UNKNOWNrr3Ú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      r7Fc Cs²dd„}dd„}tj dtƒ¡r*|ƒ}n"tj d¡r>|ƒ}ntdtƒƒ‚i}x\|D]T}|\ }}}} } } } } }}|s€t|ƒs€qV| t9} | t9} ||| | | | | ||f ||<qVW|S)zcReturn disk I/O statistics for every disk installed on the system as a dict of raw tuples. c ss6tdtƒƒ}| ¡}WdQRXx |D]}| ¡}t|ƒ}|dkr„|d}t|dƒ}tt|dd…ƒ\ }}} } } } } }}}n|dks”|dkrÆ|d}tt|dd…ƒ\ }}}} } } } } }}}nN|dkr|d}tt|dd…ƒ\}}} } d } } }} }n td |ƒ‚||| || | | || |f Vq*WdS) Nz %s/diskstatsér"r:r#éér#rz!not sure how to interpret line %r)rr r.rvrr±r0rÎ)rr1rµr’Zflenr…ÚreadsÚ reads_mergedÚrbytesÚrtimeÚwritesÚ writes_mergedÚwbytesÚwtimerÂrZr?r?r@Ú read_procfsLs& (*  z%disk_io_counters..read_procfsc ssÀxºt d¡D]¬}x¦t tj d|¡¡D]Ž\}}}d|kr:q&ttj |d¡ƒ}| ¡ ¡ ¡}WdQRXtj  |¡}t t |dd…ƒ\ }}} } } } } }}}||| | | | ||| |f Vq&Wq WdS)Nz /sys/blockÚstatrŠ) rtrþÚwalkr\r¹rr”r•rvÚbasenamer0r±)ÚblockÚrootrÂÚfilesrr’r…r;r<r=r>r?r@rArBrZr?r?r@Ú read_sysfsws  & z$disk_io_counters..read_sysfsz %s/diskstatsz /sys/blockzC%s/diskstats nor /sys/block filesystem are available on this system)rtr\rár rår†ÚDISK_SECTOR_SIZE)ZperdiskrCrJÚgenr2rÊr…r;r?r=rAr>rBr<r@rZr?r?r@Údisk_io_countersHs&+      rMc Cstƒ}tƒ}td|ƒV}xN|D]F}| ¡}| d¡sF| | ¡¡q | d¡d}|dkr | d¡q WWdQRX|dkr–tj  d¡r–tj  d¡}ntj  d |¡}g}t   |¡}x`|D]X} | \} } }} | d krÖd } |sì| d ksº||krìqºd} }t  | | || | |¡}| |¡qºW|S) z8Return mounted disk partitions as a list of namedtuples.z%s/filesystemsZnodevú rZzfsNz/procz /etc/mtabz%s/self/mountsZnoner$)rÖr rr•r«rØrvrtr\ÚisfileÚrealpathrÀÚdisk_partitionsrZ sdiskpartrŽ)rñZfstypesrrrµZfstypeZ mounts_pathÚretlistZ partitionsÚ partitionZdeviceZ mountpointZoptsZmaxfileZmaxpathÚntupler?r?r@rQ§s6      rQc Cstt t¡}t d¡}| t d¡¡ttdd„|Dƒƒƒ}t d¡}t d¡}x*|D]"}|  d|¡}||krT|  |¡qTWx|D]}y>|d}t t |ƒƒd }t j t j |¡d ¡}t |d d } Wntttfk râw‚YnXt |d dd} t |ddd} t |ddd d} | dk rLyt | ƒd } Wntk rJd} YnX| dk r‚yt | ƒd } Wntk r€d} YnX||   | || | f¡q‚W|slt d¡}tt|ƒƒ}x°|D]¦}ytttfk r@} ztd| |fƒwÀWdd} ~ XYnXt |d¡}tdd„|Dƒƒ}d} d} xä|D]Ü}t j ||d¡}t |dd d}|dkrºt t j ||d¡dd} n$|dkrÞt t j ||d¡dd} | dk ryt | ƒd } Wntk rd} YnX| dk rpyt | ƒd } Wntk rHd} YnXqpW||   d|| | f¡qÀWt|ƒS)aøReturn hardware (CPU and others) temperatures as a dict including hardware name, label, current, max and critical temperatures. Implementation notes: - /sys/class/hwmon looks like the most recent interface to retrieve this info, and this implementation relies on it only (old distros will probably use something else) - lm-sensors on Ubuntu 16.04 relies on /sys/class/hwmon - /sys/class/thermal/thermal_zone* is another one but it's more difficult to parse z/sys/class/hwmon/hwmon*/temp*_*z&/sys/class/hwmon/hwmon*/device/temp*_*cSsg|]}| d¡d‘qS)rÂr)rv)r­rHr?r?r@r®åsz(sensors_temperatures..z5/sys/devices/platform/coretemp.*/hwmon/hwmon*/temp*_*z'/sys/devices/platform/coretemp.*/hwmon/z/sys/class/hwmon/Ú_inputg@@r…F)r›Z_maxN)rš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¹rtr\rFrv)r­râr?r?r@r®%sZ_typeÚcriticalZ_tempÚhigh)Ú collectionsrrýr×ÚextendÚsortedrÖrÐrÑÚsubrŽrÅrœrtr\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Ž                    rec Csât t¡}t d¡}|s"t d¡}ttdd„|Dƒƒƒ}x |D]˜}ytt|dƒƒ}Wn8tt fk rŽ}zt   d|t ¡w>Wdd}~XYnXtt j t j |¡d¡d d }t|d d d d }|| t ||¡¡q>Wt|ƒS)a‡Return hardware fans info (for CPU and other peripherals) as a dict including hardware label and current speed. Implementation notes: - /sys/class/hwmon looks like the most recent interface to retrieve this info, and this implementation relies on it only (old distros will probably use something else) - lm-sensors on Ubuntu 16.04 relies on /sys/class/hwmon z/sys/class/hwmon/hwmon*/fan*_*z%/sys/class/hwmon/hwmon*/device/fan*_*cSsg|]}| d¡d‘qS)rÂr)rv)r­rHr?r?r@r®Tsz sensors_fans..rUz ignoring %rNr…F)r›rVr$)ršr›)rZrrýr×r\rÖr±rœr–r—rºr»r¼rtr\r¹r^rŽrZsfanr_)r¨r`rbr§rÃrcrdr?r?r@Ú sensors_fansCs    rfc sÞtƒ‰‡fdd„}dd„t t¡Dƒ}|s.dStj tt|ƒd¡}||d|dƒ}||d |d ƒ}||d |d ƒ}||d ƒ}|dk rÂ|dk rÂyd||}Wqâtk r¾d}YqâXn tt |dddƒ}|dkrâdSd}|tj td¡tj td¡ƒ} | dk r| dk}n4t |dddd  ¡} | dkr>d}n| dkrLd}|rZt j } nv|dk r¢|dk r¢yt||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 cs:x4|D],}t|ˆd}|ˆkr| ¡r.t|ƒS|SqWdS)zvAttempt to read the content of multiple files which may not exist. If none of them exist return None. )ršN)rœÚisdigitr±)Úpathsr\r¨)Únullr?r@Ú multi_catls   z"sensors_battery..multi_catcSs&g|]}| d¡sd| ¡kr|‘qS)ZBATZbattery)r«rÏ)r­rHr?r?r@r®vs z#sensors_battery..Nrz /energy_nowz /charge_nowz /power_nowz /current_nowz /energy_fullz /charge_fullz/time_to_empty_nowgY@gz /capacityr6)ršz AC0/onlinez AC/onlinerz/statusr$F)ršr›Z discharging)ZchargingZfullTié<)ÚobjectrtrþÚPOWER_SUPPLY_PATHr\r¹r\ÚZeroDivisionErrorr±rœrÏrZPOWER_TIME_UNLIMITEDZPOWER_TIME_UNKNOWNZsbattery) rjZbatsrHZ energy_nowZ power_nowZ energy_fullZ time_to_emptyrPZ power_pluggedZonliner!Zsecsleftr?)rir@Úsensors_batterycs`              roc Cs`g}t ¡}xN|D]F}|\}}}}}}|s,q|dkr8d}t ||pDd|||¡} | | ¡qW|S)z:Return currently connected users as a list of namedtuples.)z:0.0z:0Z localhostN)rÀÚusersrZsuserrŽ) rRZrawlistÚitemrlZttyZhostnameZtstampZ user_processr¤Úntr?r?r@rpÁs rpc Csbdtƒ}t|ƒF}x2|D]*}| d¡rt| ¡ ¡dƒ}|a|SqWtd|ƒ‚WdQRXdS)zAReturn the system boot time expressed in seconds since the epoch.z%s/statsbtimerzline 'btime' not found in %sN)r rr«rÅr•rvÚ BOOT_TIMEr)r\rrµr¨r?r?r@Ú boot_timeÓs    rtcCsdd„t ttƒƒ¡DƒS)z7Returns a list of PIDs currently running on the system.cSsg|]}| ¡rt|ƒ‘qSr?)rgr±)r­rHr?r?r@r®èszpids..)rtrþrr r?r?r?r@ræsrc Cs”t |¡sdSybdtƒ|f}t|ƒB}x.|D]&}| d¡r.t| ¡dƒ}||kSq.Wtd|ƒ‚WdQRXWnttfk rŽ|t ƒkSXdS)zcCheck for the existence of a unix PID. Linux TIDs are not supported (always return False). Fz %s/%s/statussTgid:rz'Tgid' line not found in %sN) rÚ pid_existsr rr«r±rvrÎÚEnvironmentErrorr)r¤r\rrµZtgidr?r?r@ruës      ruc Cs’i}tƒ}x‚tƒD]x}y(td||fƒ}| ¡}WdQRXWnttfk rVYqX| d¡}||dd… ¡}t|dƒ}|||<qW|S)zsObtain a {pid: ppid, ...} dict for all running processes in one shot. Used to speed up Process.children(). z %s/%s/statNó)r:r) r rrr”rr r/rvr±)r¨rr¤rÚdataÚrparZdsetÚppidr?r?r@Úppid_map s    r{cst ˆ¡‡fdd„ƒ}|S)zlDecorator which translates bare OSError and IOError exceptions into NoSuchProcess and AccessDenied. cs’yˆ|f|ž|ŽStk r2t|j|jƒ‚Yn\tk rRt|j|jƒ‚Yn<tk rŒtj  d|j |jf¡s†t|j|jƒ‚‚YnXdS)Nz%s/%s) rr r¤Ú_namer rrrtr\rárú)rûÚargsÚkwargs)Úfunr?r@Úwrapper%sz wrap_exceptions..wrapper)Ú functoolsÚwraps)rr€r?)rr@Úwrap_exceptions!srƒc@steZdZdZdddddgZdd„Zd d „Zeed d „ƒƒZ eed d„ƒƒZ eedd„ƒƒZ dd„Z dd„Z edd„ƒZdd„Zedd„ƒZedd„ƒZedd„ƒZej de ¡¡rÂed d!„ƒZed"d#„ƒZed$d%„ƒZed`d'd(„ƒZed)d*„ƒZed+d,„ƒZer.ee d-¡e d.¡e d/¡fd0d1„ƒZ neZ erDed2d3„ƒZ!ed4d5„ƒZ"ee d6¡fd7d8„ƒZ#ee d9¡fd:d;„ƒZ$edd?„ƒZ&ed@dA„ƒZ'e(rÐedBdC„ƒZ)e dD¡fdEdF„Z*edGdH„ƒZ+e,rîedIdJ„ƒZ-edKdL„ƒZ.e/d&k redadMdN„ƒZ0edOdP„ƒZ1edQdR„ƒZ2edbdTdU„ƒZ3edVdW„ƒZ4edXdY„ƒZ5ee dZ¡fd[d\„ƒZ6ee d]¡fd^d_„ƒZ7d&S)cÚProcesszLinux process implementation.r¤r|Ú_ppidrúÚ_cachecCs||_d|_d|_tƒ|_dS)N)r¤r|r…r rú)rûr¤r?r?r@rü;szProcess.__init__cCst d|j|jf¡dS)z+Raise NSP if the process disappeared on us.z%s/%sN)rtrDrúr¤)rûr?r?r@Ú _assert_aliveAszProcess._assert_alivec Csätd|j|jfƒ}| ¡}WdQRX| 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. z %s/%s/statNrwó(rr:r…rr!rzr#Úttynré Úutimeé Ústimeé Úchildren_utimer9Úchildren_stimeéÚ create_timeé$Úcpu_numé'Ú blkio_ticks)rrúr¤r”r/Úfindrv)rûrrxryr…r’r¨r?r?r@Ú_parse_stat_fileGs$            zProcess._parse_stat_filec Cs(td|j|jfƒ }| ¡SQRXdS)zRead /proc/{pid}/stat file and return its content. The return value is cached in case oneshot() ctx manager is in use. z %s/%s/statusN)rrúr¤r”)rûrr?r?r@Ú_read_status_filejszProcess._read_status_filec Cs0td|j|jftd}| ¡ ¡SQRXdS)Nz %s/%s/smaps)r)rrúr¤rr”r•)rûrr?r?r@Ú_read_smaps_filets zProcess._read_smaps_filecCs(|j |¡|j |¡|j |¡dS)N)r˜Zcache_activater™rš)rûr?r?r@Ú oneshot_enter{s  zProcess.oneshot_entercCs(|j |¡|j |¡|j |¡dS)N)r˜Zcache_deactivater™rš)rûr?r?r@Ú oneshot_exit€s  zProcess.oneshot_exitcCs| ¡d}trt|ƒ}|S)Nr…)r˜r!r )rûr…r?r?r@r……s z Process.namec Csšytd|j|jfƒSttfk rttj d|j|jf¡rDdSt|jƒs^t |j|j ƒ‚nt |j|j |j ƒ‚Yn"t k r”t|j|j ƒ‚YnXdS)Nz %s/%s/exez%s/%sr$)rurúr¤rr rtr\Úlexistsrurr|rr…rr )rûr?r?r@Úexes z Process.exec CsŒtd|j|jfƒ}| ¡}WdQRX|s0gS| d¡r>dnd}| |¡rX|dd…}| |¡}|dkrˆt|ƒdkrˆd|krˆ| d¡}|S)Nz %s/%s/cmdlinerqrir6r)rrúr¤r”rwrvr)rûrrxÚsepÚcmdliner?r?r@r žs    zProcess.cmdlinec Cs0td|j|jfƒ}| ¡}WdQRXt|ƒS)Nz %s/%s/environ)rrúr¤r”r)rûrrxr?r?r@Úenviron·szProcess.environcCs:t| ¡dƒ}t ¡}y||Stk r4dSXdS)Nr‰)r±r˜rZget_terminal_mapr°)rûZtty_nrrùr?r?r@Úterminal½s zProcess.terminalz /proc/%s/ioc Csðd|j|jf}i}t|ƒV}xN|D]F}| ¡}|r$y| d¡\}}Wntk r\w$Yq$Xt|ƒ||<q$WWdQRX|sˆtd|ƒ‚y*t|d|d|d|d|d|d ƒSt k rê}ztd |d ||fƒ‚Wdd}~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úr¤rr•rvrÎr±rrjr°)rûr™r’rrµr…rÞrÃr?r?r@Ú io_countersÈs0    zProcess.io_counterscCsh| ¡}t|dƒt}t|dƒt}t|dƒt}t|dƒt}t|dƒt}t|||||ƒS)Nr‹rrrr–)r˜rÅrÆrk)rûr‘r‹rrrrpr?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¡S)N)rZwait_pidr¤r|)rûZtimeoutr?r?r@Úwaitösz Process.waitcCs&t| ¡dƒ}tptƒ}|t|S)Nr’)rÅr˜rsrtrÆ)rûZctimeZbtr?r?r@r’ús zProcess.create_timec Cs`td|j|jfƒ2}dd„| ¡ ¡dd…Dƒ\}}}}}}}WdQRXt|||||||ƒS)Nz %s/%s/statmcSsg|]}t|ƒt‘qSr?)r±r²)r­rHr?r?r@r®sz'Process.memory_info..r#)rrúr¤rŒrvr`) rûrZvmsrfrWÚtextÚlibrxZdirtyr?r?r@Ú memory_infos 6zProcess.memory_infos\nPrivate.*:\s+(\d+)s\nPss\:\s+(\d+)s\nSwap\:\s+(\d+)c Csj| ¡}| ¡}ttt| |¡ƒƒd}ttt| |¡ƒƒd}ttt| |¡ƒƒd}t||||fŽS)Ni)r§ršrÙr0r±Úfindallra) rûZ _private_reZ_pss_reZ_swap_reZ basic_memZ smaps_datarbrcrdr?r?r@Úmemory_full_infos  zProcess.memory_full_infocCsZdd„}| ¡}|sgS| d¡}g}| d¡}|g}x|||ƒD] \}}| dd¡}y|\} } } } } }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 ¡qDW|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}x|D]ˆ}| dd¡}|d d¡sB| ¡|fV| |¡q yt|dƒd||d<Wq tk r|d d¡r€w n td|ƒ‚Yq Xq W| ¡|fVdS)NérrérisVmFlags:z#don't know how to interpret line %r)rvrwÚpoprŽr±rÎr«)r1Ú current_blockrxrµr’r?r?r@Ú get_blocksEs   z'Process.memory_maps..get_blocksó rNrªr$z[anon]z (deleted)iöÿÿÿsRss:sSize:sPss:s Shared_Clean:s Shared_Dirty:sPrivate_Clean:sPrivate_Dirty:s Referenced:s Anonymous:sSwap:) ršrvr«rÎr!r r•rwrrŽr¯)rûr­rxr1rÚZ first_liner¬ÚheaderZhfieldsrZpermsÚoffsetZdevrr\r?r?r@Ú memory_maps<sF               zProcess.memory_mapsc Cs^ytd|j|jfƒSttfk rXt|jƒsBt|j|jƒ‚nt|j|j|j ƒ‚YnXdS)Nz %s/%s/cwd) rurúr¤rr rurr|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årúr¤rZpctxswr±)rûZ _ctxsw_rerxZctxswr?r?r@Únum_ctx_switches‹s zProcess.num_ctx_switchessThreads:\t(\d+)cCs| ¡}t| |¡dƒS)Nr)r™r±r¨)rûZ_num_threads_rerxr?r?r@Ú num_threads™szProcess.num_threadsc Csòt d|j|jf¡}| ¡g}d}xº|D]²}d|j|j|f}y$t|ƒ}| ¡ ¡}WdQRXWntk r€d}w,YnX||  d¡dd…}|  d¡}t |dƒt } t |d ƒt } t  t|ƒ| | ¡} | | ¡q,W|rî| ¡|S) Nz %s/%s/taskFz%s/%s/task/%s/statTrwr:r¿rŠrŒ)rtrþrúr¤Úsortrr”r•rr—rvrÅrÆrZpthreadr±rŽr‡) rûZ thread_idsrRÚ hit_enoentZ thread_idr™rÚstr‘r‹rrTr?r?r@Úthreads¡s,   zProcess.threadscCs t |j¡S)N)r5Ú getpriorityr¤)rûr?r?r@Únice_get½szProcess.nice_getcCst |j|¡S)N)r5Ú setpriorityr¤)rûrÞr?r?r@Únice_setÆszProcess.nice_setcCs t |j¡S)N)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¨rýrär±rrË)rûZ_rerxrÒr?r?r@Ú_get_eligible_cpusÑs  *zProcess._get_eligible_cpusc Cs®yt |j|¡Wn–ttfk r¨}ztt|tƒs>|jtjkr–| ¡}t t t t ƒƒƒƒ}x<|D]4}||krztd||fƒ‚||kr^td||fƒ‚q^W‚Wdd}~XYnXdS)Nz(invalid CPU number %r; choose between %sz0CPU number %r is not eligible; choose between %s) rÀZproc_cpu_affinity_setr¤r—rÎrrrªrÿr¾ÚtuplerärrË)rûrÉrÃZ eligible_cpusZall_cpusZcpur?r?r@Úcpu_affinity_setÛs   zProcess.cpu_affinity_setcCs,t |j¡\}}tdk r t|ƒ}t ||¡S)N)rÀr3r¤Úenumr;rZpionice)rûÚioclassrÞr?r?r@Ú ionice_getñszProcess.ionice_getcCsP|dkr d}|r(|ttfkr(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?r?r@Ú ionice_setøs zProcess.ionice_setc Cs¨|jdkrtdƒ‚yB|dkr(t|j|ƒSt|ƒdkrDtdt|ƒƒ‚t|j||ƒWnNtk r¢}z0|jtjkrt|jƒrt |j|j |j ƒ‚n‚Wdd}~XYnXdS)Nrz)can't use prlimit() against PID 0 processr:z4second argument must be a (soft, hard) tuple, got %s) r¤rÎrrr'r—rªZENOSYSrurr|r…)rûr¥r¦rÃr?r?r@Úrlimits    zProcess.rlimitcCs$| ¡d}tr| ¡}t |d¡S)Nr!ú?)r˜r!r Ú PROC_STATUSESr¯)rûZletterr?r?r@r!s zProcess.statusc Cs\g}t d|j|jf¡}d}x(|D]}d|j|j|f}y t|ƒ}WnNttfk rhd}w&Yq&tk r˜}z|jtj kr†w&‚Wdd}~XYq&X|  d¡r&t |ƒr&d|j|j|f}yBt |ƒ0}t | ¡ ¡dƒ} t | ¡ ¡ddƒ} WdQRXWntk rd}Yq&Xt| ƒ} t|t |ƒt | ƒ| | ƒ} | | ¡q&W|rX| ¡|S) Nz%s/%s/fdFz %s/%s/fd/%sTrz%s/%s/fdinfo/%srrˆ)rtrþrúr¤rurr r—rªrÿr«rrr±rŒrvr€r[rŽr‡) rûrRrIr¶r]rr\rÃrÚposr_r^rTr?r?r@Ú open_files&s<   $ zProcess.open_filesrôcCst ||j¡}| ¡|S)N)r,r)r¤r‡)rûr(r¨r?r?r@Ú connectionsRszProcess.connectionscCstt d|j|jf¡ƒS)Nz%s/%s/fd)rrtrþrúr¤)rûr?r?r@Únum_fdsXszProcess.num_fdscCst| ¡dƒS)Nrz)r±r˜)rûr?r?r@rz\sz Process.ppidsUid:\t(\d+)\t(\d+)\t(\d+)cCs6| ¡}| |¡d\}}}t t|ƒt|ƒt|ƒ¡S)Nr)r™r¨rZpuidsr±)rûZ_uids_rerxÚrealÚ effectiveÚsavedr?r?r@Úuids`sz Process.uidssGid:\t(\d+)\t(\d+)\t(\d+)cCs6| ¡}| |¡d\}}}t t|ƒt|ƒt|ƒ¡S)Nr)r™r¨rZpgidsr±)rûZ_gids_rerxrÌrÍrÎr?r?r@Úgidsfsz Process.gids)N)N)rô)8r<r=r>r*Ú __slots__rür‡rƒrr˜r™ršr›rœr…ržr r¡r¢rtr\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ÄrrÅr!rÉrÊrËrzrÏrÐr?r?r?r@r„6sz"          D           ,   r„)N)rô)F)F)¤r*Z __future__rr rZrªrr×rtrÐrõrÚsysÚ tracebackrºrrr$rrrrÀr r5r r r r rrrrrrrrrrrrrrZ_compatrrrrr r!Ú version_inforÁZ__extra__all__rmr\rárÒrÓÚhasattrrÕrÔrlr˜rÍrÆZ getpagesizer²rsrÚ byteorderr rKZ 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/r0r1r2rrMrYr[r`rÇrarer¹rhrjrkrur€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ër,r-r3r7Z disk_usagerMrQrerfrorprtrrur{rƒr„r?r?r?r@Úsf                                                    4z:*   k % _ +q ^