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)ééÚ 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ÚsdiskioÚ read_countÚ write_countÚ read_bytesÚ write_bytesÚ read_timeÚ 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ÚsizerkZ shared_cleanZ shared_dirtyZ private_cleanZ private_dirtyZ referencedZ anonymousrlÚ 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)rcr@r@rAr}Ðs   r}cCsXtjdtjdtjdi}||tjtjBtjB@}|tj@rH| ddd¡}| dd¡}|S)zZConvert file's open() flags into a readable string. Used by Process.open_files(). ÚrÚwzw+Úarzr+)r|ÚO_RDONLYÚO_WRONLYÚO_RDWRÚO_APPENDÚreplace)rgZ modes_maprfr@r@rAÚ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‡r|ÚaccessÚF_OK)ÚnameZincluding_virtualrcr@r@rAÚ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/statrNrtÚniceruÚidlerxZirqZsoftirqéZstealé Zguesté Z guest_niceÚ scputimes)rÚreadliner~ÚlenÚappendrr”)Ú procfs_pathÚfÚvaluesÚfieldsZvlenr@r@rAÚ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Úbinaryr™r@r@rAÚcatsr¥z/procr”zuser system idleg)Úprlimit)Ú 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?ÚctypesÚ c_longlongÚ_fields_r@r@r@rAÚ StructRlimitJsr­rr) rªÚ StructureÚlibcr¦Úbyrefr¨r©Ú get_errnor r|Ústrerror)ÚpidÚ resource_Úlimitsr­ÚcurrentÚretÚnewÚerrnor@r@rAr¦Is  cCs"g|]}| d¡r| ¡r|‘qS)ZRLIM)Ú startswithÚisupper)Ú.0rIr@r@rAú 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ºÚintr~ÚPAGESIZEÚmin) ÚmemsrSr£Zlru_active_fileZlru_inactive_fileZslab_reclaimabler™Z watermark_lowÚlineÚavailZ pagecacher@r@rAÚ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:rVsCached:rWs SReclaimable:sShmem:s MemShared:rXsActive:rTs Inactive:s Inact_dirty:s Inact_clean:sInact_laundry:rUsSlab:s MemAvailable:rP)Úround_z6%s memory stats couldn't be determined and %s set to 0z, ÚwasÚwere)rr r~rÀr¿r—r¾rÆrÚjoinr–ÚwarningsÚwarnÚRuntimeWarningrN)Zmissing_fieldsrÃr™rÄr›rOrSrVrWrXrTrUrYrRrÅrQÚmsgr@r@rAÚ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 r~rÀr¿ÚcextZ linux_sysinforrŸÚstrrËrÌrÍrºrÚsswap)rÃr™rÄr›rOrSÚ_Zunit_multiplierrRrQÚerrrÎÚsinÚsoutr@r@rAÚ 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¼rIr@r@rAr½^szcpu_times..)r rœrr•r~r–r”Ú_fields)r˜r™ršr›r@r@rAÚ 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¼rIr@r@rAr½psz!per_cpu_times..N) r rœrr•rºr~r–r”rÛr—)r˜Úcpusr™rÄršr›Úentryr@r@rAÚ 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/statrq) r|ÚsysconfÚ ValueErrorrr ÚlowerrºÚreÚcompilerr~Úmatch)Únumr™rÄÚsearchr@r@rAÚ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Úaddrržr–r rãr¿rºr~rÀÚsumrš) ÚlsÚp1Úp2rcr™ÚresultÚmappingZ current_inforÄÚkeyÚvaluer@r@rAÚ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Àr~rÚ scpustats)r™Ú ctx_switchesÚ interruptsÚsoft_interruptsrÄÚsyscallsr@r@rAÚ 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)r|rcÚexists)rçÚpr@r@rAÚ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ér|rcrÊr¥ÚNotImplementedErrorrÀr—rÚscpufreq)rþr·ÚnrcZpjoinÚcurrZmax_Zmin_r@r@rAÚcpu_freqÔs$ rz /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ºr~r—rrrÙ)r·r™rÄrórôr@r@rArõs &cCsgS)zGDummy implementation when none of the above files are present. r@r@r@r@rArsc@s eZdZdS)Ú_Ipv6UnsupportedErrorN)r=r>r?r@r@r@rArsrc@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 ÚinetÚinet4Úinet6)ÚsocketÚAF_INETÚ SOCK_STREAMÚAF_INET6Ú SOCK_DGRAMÚAF_UNIXÚtmapÚ _procfs_path)Úselfrr rr r r@r@rAÚ__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‘r7)rÚlistr|Úlistdirrr}rr r r¹ÚEINVALrºr—rÀ)rr³ÚinodesrdÚinoderÕr@r@rAÚget_proc_inodes7s  zConnections.get_proc_inodesc CsJi}x@tƒD]6}y| | |¡¡Wq tttfk r@w Yq Xq W|S)N)ÚpidsÚupdater"rr r)rr r³r@r@rAÚ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@ÚasciiNr7ú>4Iú<4I)r))r*)r~rÀr!ÚencoderrÚ LITTLE_ENDIANÚ inet_ntopÚbase64Ú b16decoderÚstructÚpackÚunpackrârrrÚaddr)r3ÚfamilyÚipÚportr@r@rAÚ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)Nr7)rr|rcrürÚBIGFILE_BUFFERINGr•Ú enumerater~râÚ RuntimeErrorrrÚ TCP_STATUSESrÚ CONN_NONErr7r)Úfiler4Útype_r Ú filter_pidr™ÚlinenorÄrÔÚladdrÚraddrÚstatusr!r³rdr@r@rAÚ 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.)r9rérqz)error while parsing %s; malformed line %r)Nr7Nr‘r7Ú) rr:r•r~râr<r–rÚsocktype_to_enumrÀr>)r?r4r rAr™rÄÚtokensrÔr@r!Úpairsr³rdrcrDrEr@r@rAÚ 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¼rIr@r@rAr½ász(Connections.retrieve..z %s/net/%s)rA)rrârÊr rr"r%rêrrrrFrLrÚpconnÚsconnrìr)rÚkindr³r r·Z proto_namer4r@rcrîrdrCrDrEZ bound_pidZconnr@r@rAÚretrieveÞs2  zConnections.retrieve)N)N)N) r=r>r?Ú__doc__rr"r%Ú staticmethodr7rFrLrQr@r@r@rArs  3 ' %rrcCs t |¡S)z$Return system-wide open connections.)Ú _connectionsrQ)rPr@r@rAÚnet_connectionssrUcCsÈ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;r&rr) rr Ú readlinesÚrfindr{rMržr~ÚmaprÀ)r™ÚlinesÚretdictrÄÚcolonrr›Ú bytes_recvÚ packets_recvÚerrinÚdropinZfifoinZframeinZ compressedinZ multicastinÚ bytes_sentÚ packets_sentÚerroutÚdropoutZfifooutZ collisionsoutZ carrieroutZ compressedoutr@r@rAÚnet_io_counterss *rdc 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_UNKNOWNrrdÚkeysÚ cext_posixZ net_if_mtuZnet_if_is_runningZnet_if_duplex_speedr r¹ZENODEVrÚ snicstats) Z duplex_mapÚnamesr·rÚmtuÚisupÚduplexÚspeedrÕr@r@rAÚ net_if_stats+s      rmFc 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#éérGrz!not sure how to interpret line %r)rr rVr~r–rÀrXrâ)r™rYrÄr›ZflenrÚreadsÚ reads_mergedÚrbytesÚrtimeÚwritesÚ writes_mergedÚwbytesÚwtimerÔrar@r@rAÚ 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“) r|rÚwalkrcrÊrrržr~ÚbasenamerXrÀ)ÚblockÚrootrÔÚfilesr™r›rrqrrrsrtrurvrwrxrar@r@rAÚ read_sysfsws  & z$disk_io_counters..read_sysfsz %s/diskstatsz /sys/blockzC%s/diskstats nor /sys/block filesystem are available on this system)r|rcrür rrŽÚDISK_SECTOR_SIZE)Zperdiskryr€ÚgenrZrÞrrqrursrwrtrxrrrvrar@r@rAÚdisk_io_countersHs&+      rƒc 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/mountsZnonerH)rêr rržrºrìr~r|rcÚisfileÚrealpathrÑÚdisk_partitionsrÚ sdiskpartr—)r Zfstypesr˜r™rÄÚfstypeZ mounts_pathÚretlistÚ partitionsÚ partitionÚdeviceÚ mountpointÚoptsÚmaxfileÚmaxpathÚntupler@r@rAr‡§s6      r‡c 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)r~)r¼rIr@r@rAr½åsz(sensors_temperatures..z5/sys/devices/platform/coretemp.*/hwmon/hwmon*/temp*_*z'/sys/devices/platform/coretemp.*/hwmon/z/sys/class/hwmon/Ú_inputg@@rF)r¤Z_maxN)r£Z_critÚ_labelrH)r£r¤z /sys/class/thermal/thermal_zone*ÚtempÚtypezignoring %r for file %rz /trip_point*cSs,g|]$}d tj |¡ d¡dd…¡‘qS)rÔrr")rÊr|rcr|r~)r¼rýr@r@rAr½%sZ_typeÚcriticalÚ_tempÚhigh)Ú collectionsrrrëÚextendÚsortedrêräråÚsubr—rÙr¥r|rcrÊÚdirnamerŸr râr Údict)r·Ú basenamesZ basenames2ÚreplrZaltnameÚbasercr¶Ú unit_namer™r—ÚlabelrÕZ trip_pathsZ trip_pointsZ trip_pointZ trip_typer@r@rAÚsensors_temperaturesÒsŽ                    r¥c 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)r~)r¼rIr@r@rAr½Tsz sensors_fans..r“z ignoring %rNrF)r¤r”rH)r£r¤)ršrrrërœrêrÀr¥rŸr rËrÌrÍr|rcrÊržr—rÚsfanrŸ)r·r r¢r¶rÕr£r¤r@r@rAÚ sensors_fansCs    r§c 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À)Úpathsrcr·)Únullr@rAÚ multi_catls   z"sensors_battery..multi_catcSs&g|]}| d¡sd| ¡kr|‘qS)ZBATZbattery)rºrã)r¼rIr@r@rAr½vs z#sensors_battery..Nrz /energy_nowz /charge_nowz /power_nowz /current_nowz /energy_fullz /charge_fullz/time_to_empty_nowgY@gz /capacityr7)r£z AC0/onlinez AC/onlinerz/statusrHF)r£r¤Z discharging)ZchargingÚfullTié<)Úobjectr|rÚPOWER_SUPPLY_PATHrcrÊrœÚZeroDivisionErrorrÀr¥rãrÚPOWER_TIME_UNLIMITEDÚPOWER_TIME_UNKNOWNÚsbattery) r«Zbatsr~Z energy_nowZ power_nowZ energy_fullZ time_to_emptyrQÚ power_pluggedZonlinerEÚsecsleftr@)rªrAÚsensors_batterycs`              r¶c 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ÑÚusersrÚsuserr—) rŠZrawlistÚitemrtÚttyÚhostnameZtstampZ user_processr³Úntr@r@rAr·Ás r·c 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žr~Ú BOOT_TIMEr<)rcr™rÄr·r@r@rAÚ 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¼rIr@r@rAr½èszpids..)r|rrr r@r@r@rAr#æsr#c 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Àr~râÚEnvironmentErrorr#)r³rcr™rÄZtgidr@r@rAr¿ës      r¿c 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 r#rrrr rWr~rÀ)r·r˜r³r™ÚdataÚrparZdsetÚppidr@r@rAÚ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 rrr|rcrür)rÚargsÚkwargs)Úfunr@rAÚwrapper%sz wrap_exceptions..wrapper)Ú functoolsÚwraps)rÉrÊr@)rÉrAÚ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)rr³r@r@rAr;szProcess.__init__cCst d|j|jf¡dS)z+Raise NSP if the process disappeared on us.z%s/%sN)r|rzrr³)rr@r@rAÚ _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/statNrÁó(rr;rrrErÄr#Úttynré Úutimeé Ústimeé Úchildren_utimeroÚchildren_stimeéÚ create_timeé$Úcpu_numé'Ú blkio_ticks)rrr³rrWÚfindr~)rr™rÂrÃrr›r·r@r@rAÚ_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)rrr³r)rr™r@r@rAÚ_read_status_filejszProcess._read_status_filec Cs0td|j|jftd}| ¡ ¡SQRXdS)Nz %s/%s/smaps)r9)rrr³r:rrž)rr™r@r@rAÚ_read_smaps_filets zProcess._read_smaps_filecCs(|j |¡|j |¡|j |¡dS)N)râÚcache_activaterãrä)rr@r@rAÚ oneshot_enter{s  zProcess.oneshot_entercCs(|j |¡|j |¡|j |¡dS)N)râÚcache_deactivaterãrä)rr@r@rAÚ oneshot_exit€s  zProcess.oneshot_exitcCs| ¡d}trt|ƒ}|S)Nr)râr!r )rrr@r@rAr…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/%srH)r}rr³rr r|rcÚlexistsr¿rrÆrrÏrr )rr@r@rAÚ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/cmdlineryrqr7r)rrr³rrr~r–)rr™rÂÚsepÚcmdliner@r@rArìžs    zProcess.cmdlinec Cs0td|j|jfƒ}| ¡}WdQRXt|ƒS)Nz %s/%s/environ)rrr³rr)rr™rÂr@r@rAÚenviron·szProcess.environcCs:t| ¡dƒ}t ¡}y||Stk r4dSXdS)NrÓ)rÀrârZget_terminal_mapr¿)rZtty_nrrr@r@rAÚ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) rr³rržr~rârÀr<rrr¿)rr¢r›r™rÄrrôrÕr@r@rAÚ io_countersÈs0    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Úrs)rršrÕr×rÙrÚrxr@r@rArÜçszProcess.cpu_timescCst| ¡dƒS)zWhat CPU the process is on.rÞ)rÀrâ)rr@r@rArÞñszProcess.cpu_numNcCst |j||j¡S)N)rZwait_pidr³rÆ)rÚtimeoutr@r@rAÚwaitösz Process.waitcCs&t| ¡dƒ}tptƒ}|t|S)NrÜ)rÙrâr½r¾rÚ)rÚctimeZbtr@r@rArÜús zProcess.create_timec Cs`td|j|jfƒ2}dd„| ¡ ¡dd…Dƒ\}}}}}}}WdQRXt|||||||ƒS)Nz %s/%s/statmcSsg|]}t|ƒt‘qSr@)rÀrÁ)r¼rIr@r@rAr½sz'Process.memory_info..rG)rrr³r•r~rh) rr™ZvmsrnrXÚtextÚlibrÂZdirtyr@r@rAÚ 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írXrÀÚfindallri) rZ _private_reZ_pss_reZ_swap_reZ basic_memZ smaps_datarjrkrlr@r@rAÚ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érrrisVmFlags:z#don't know how to interpret line %r)r~rÚpopr—rÀrârº)rYÚ current_blockrÂrÄr›r@r@rAÚ get_blocksEs   z'Process.memory_maps..get_blocksó rNrørHz[anon]z (deleted)iöÿÿÿsRss:sSize:sPss:s Shared_Clean:s Shared_Dirty:sPrivate_Clean:sPrivate_Dirty:s Referenced:s Anonymous:sSwap:) rär~rùrâr!r ržrrr—r¾)rrûrÂrYrîÚ first_linerúÚheaderZhfieldsr3ZpermsÚoffsetÚdevr!rcr@r@rAÚ 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) r}rr³rr r¿rrÆrrÏ)rr@r@rAÚ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örrr³rÚpctxswrÀ)rZ _ctxsw_rerÂZctxswr@r@rAÚnum_ctx_switches‹s zProcess.num_ctx_switchessThreads:\t(\d+)cCs| ¡}t| |¡dƒS)Nr)rãrÀrö)rZ_num_threads_rerÂr@r@rAÚ 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/statTrÁr;rÐrÔrÖ)r|rrr³Úsortrrržrrár~rÙrÚrÚpthreadrÀr—rÑ) rZ thread_idsrŠÚ hit_enoentZ thread_idr¢r™ÚstršrÕr×r’r@r@rAÚthreads¡s,   zProcess.threadscCs t |j¡S)N)rfÚ getpriorityr³)rr@r@rAÚnice_get½szProcess.nice_getcCst |j|¡S)N)rfÚ setpriorityr³)rrôr@r@rAÚnice_setÆszProcess.nice_setcCs t |j¡S)N)rÑr5r³)rr@r@rAÚ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@rAÚ_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ârzr¹rrÚtuplerÿr–rß)rrÝrÕZ eligible_cpusZall_cpusZcpur@r@rAÚcpu_affinity_setÛs   zProcess.cpu_affinity_setcCs,t |j¡\}}tdk r t|ƒ}t ||¡S)N)rÑr4r³Úenumr<rÚpionice)rÚioclassrôr@r@rAÚ ionice_getñszProcess.ionice_getcCsP|dkr d}|r(|ttfkr(td|ƒ‚|dks8|dkr@tdƒ‚t |j||¡S)Nrz%r ioclass accepts no valuerGzvalue not in 0-7 range)r(r%rârÑZproc_ioprio_setr³)rrrôr@r@rAÚ 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âr¦r–rMr r¹ZENOSYSr¿rrÆrÏ)rr´rµrÕr@r@rAÚrlimits    zProcess.rlimitcCs$| ¡d}tr| ¡}t |d¡S)NrEú?)râr!r Ú PROC_STATUSESr¾)rÚletterr@r@rArEs 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/%sTr‰z%s/%s/fdinfo/%srr‘)r|rrr³r}rr r r¹rrºrrrÀr•r~rˆrbr—rÑ) rrŠrrrdr?rcrÕr™Úposrgrfr’r@r@rAÚ open_files&s<   $ zProcess.open_filesrcCst ||j¡}| ¡|S)N)rTrQr³rÑ)rrPr·r@r@rAÚ connectionsRszProcess.connectionscCstt d|j|jf¡ƒS)Nz%s/%s/fd)r–r|rrr³)rr@r@rAÚnum_fdsXszProcess.num_fdscCst| ¡dƒS)NrÄ)rÀrâ)rr@r@rArÄ\sz Process.ppidsUid:\t(\d+)\t(\d+)\t(\d+)cCs6| ¡}| |¡d\}}}t t|ƒt|ƒt|ƒ¡S)Nr)rãrörÚpuidsrÀ)rZ_uids_rerÂÚrealÚ effectiveÚsavedr@r@rAÚuids`sz Process.uidssGid:\t(\d+)\t(\d+)\t(\d+)cCs6| ¡}| |¡d\}}}t t|ƒt|ƒt|ƒ¡S)Nr)rãrörÚpgidsrÀ)rZ_gids_rerÂr"r#r$r@r@rAÚgidsfsz Process.gids)N)N)r)8r=r>r?rRÚ __slots__rrÑrÍrrârãrärærèrrêrìrírîr|rcrüÚgetpidrïrÜrÞrñrÜrõÚ HAS_SMAPSrärår÷rrrrr r rÚHAS_CPU_AFFINITYrrrÚHAS_PROC_IO_PRIORITYrrr¦rrErrr rÄr%r'r@r@r@rArÎ6sz"          D           ,   rÎ)N)r)F)F)¤rRÚ __future__rr.ršr¹rËrër|rärr0ÚsysÚ tracebackrËrrrHrrrrÑr rfr r r r rrrrrrrrrrrrrrÚ_compatrrrrr r!Ú version_inforZ__extra__all__r¯rcrür)r*Úhasattrr,r+r®r¡rárÚZ getpagesizerÁr½r:Ú byteorderr,rÚ AF_PACKETr:ÚIntEnumrÀr9r%r&r'r(r<Úglobalsr$Ú __members__ÚSTATUS_RUNNINGÚSTATUS_SLEEPINGÚSTATUS_DISK_SLEEPÚSTATUS_STOPPEDÚSTATUS_TRACING_STOPÚ STATUS_ZOMBIEÚ STATUS_DEADÚSTATUS_WAKE_KILLÚ STATUS_WAKINGÚ STATUS_IDLEÚ STATUS_PARKEDrr)r*r+r,r-r.r/r0r1r2r3r=rNrZrbrhrÛrirmrÊrprrrsr}rˆrŽrœr¥Ú ExceptionÚ print_excr”r¦ÚresourceÚ ImportErrorrªÚCDLLr¯r›ÚdirrÆrÏrØrÜrßrérõrûrZ net_if_addrsrrrTrUrdrmÚ disk_usagerƒr‡r¥r§r¶r·r¾r#r¿rÅrÍrÎr@r@r@rAÚsf                                                    4z:*   k % _ +q ^