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ÚiowaitcCs:t |¡}| d¡d}| d¡r6t|ƒs6|dd…}|S)zWrapper around os.readlink().úrz (deleted)Niöÿÿÿ)ÚosÚreadlinkÚsplitÚendswithr)r\r?r?r@rsÐs   rscCsXtjdtjdtjdi}||tjtjBtjB@}|tj@rH| ddd¡}| dd¡}|S)zZConvert file's open() flags into a readable string. Used by Process.open_files(). ÚrÚwzw+Úarzr+)rrÚ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)r}rrÚ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ÚreadlinertÚ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ÚbinaryrŽr?r?r@Úcatsršz/procr‰zuser system idleg)Úprlimit)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@Ú StructRlimitJsrŸrr) ržZ StructureÚlibcr›ZbyrefrœrZ get_errnor•rrÚstrerror)ÚpidÚ resource_ÚlimitsrŸÚcurrentÚretÚnewÚerrnor?r?r@r›Is  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©ÚintrtÚPAGESIZEÚmin) ÚmemsrRr˜Zlru_active_fileZlru_inactive_fileZslab_reclaimablerŽZ 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 rtr¯r®rŒr­rµrÚjoinr‹ÚwarningsÚwarnÚRuntimeWarningrM)Zmissing_fieldsr²rŽr³rrNrRrUrVrWrSrTrXrQr´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 rtr¯r®ÚcextZ linux_sysinforr”Ústrr¸r¹rºr©rZsswap)r²rŽr³rrNrRÚ_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Šrtr‹r‰Ú_fields)rrŽrrr?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©rtr‹r‰rÅrŒ)rÚcpusrŽr³rrÚ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) rrÚsysconfÚ ValueErrorrr Úlowerr©ÚreÚcompilerrtÚmatch)ÚnumrŽr³Ú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“r‹r rÍr®r©rtr¯Ú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¯rtrZ scpustats)rŽZ ctx_switchesZ interruptsZsoft_interruptsr³Zsyscallsr?r?r@Ú cpu_stats½s"    rÞz'/sys/devices/system/cpu/cpufreq/policy0z$/sys/devices/system/cpu/cpu0/cpufreqcCsÂdd„}g}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)rrr\Ú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Órrr\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©rtrŒrrärÃ)r¦rŽr³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ÚlistrrÚlistdirrørsrr 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ùrþr¢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)rtr¯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)rurrr\rßrÚBIGFILE_BUFFERINGrŠÚ enumeratertrÌÚ RuntimeErrorrórõÚ TCP_STATUSESrÚ CONN_NONErérrè)ÚfilerÚtype_rþÚ filter_pidrŽÚlinenor³rÀÚladdrÚraddrÚstatusrÿr¢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ŠrtrÌrr‹rZsocktype_to_enumr¯r)rrrþrrŽr³ÚtokensrÀrrÿZpairsr¢r]r\rrr?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¢rþr¦Z proto_namerrr\rØr]rrrZ 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]x}| d¡}|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:rr)rr Ú readlinesÚrfindr“rtÚmapr¯)rŽÚlinesÚretdictr³ZcolonrƒrZ bytes_recvZ packets_recvZerrinZdropinZfifoinZframeinZ compressedinZ multicastinZ bytes_sentZ packets_sentZerroutZdropoutZfifooutZ collisionsoutZ carrieroutZ compressedoutr?r?r@Únet_io_counterss *r1c 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_UNKNOWNrr1Ú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      r5Fc 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,rtr‹r¯r.rÌ)rŽr/r³rZflenrƒÚ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ˆ) rrrüÚwalkr\r·rr’r“rtÚbasenamer.r¯)ÚblockÚrootrÀÚfilesrŽrrƒr9r:r;r<r=r>r?r@rZr?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)rrr\rßr rãr„ÚDISK_SECTOR_SIZE)ZperdiskrArHÚgenr0rÈrƒr9r=r;r?r<r@r:r>rZr?r?r@Údisk_io_countersHs&+      rKc 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Örtrrr\ÚisfileÚrealpathr¾Údisk_partitionsrZ sdiskpartrŒ)rïZfstypesrrŽr³ZfstypeZ mounts_pathÚretlistZ partitionsÚ partitionZdeviceZ mountpointZoptsZmaxfileZmaxpathÚntupler?r?r@rO§s6      rOc 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)rt)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·rrr\rDrt)r«ràr?r?r@r¬%sZ_typeÚcriticalZ_tempÚhigh)Ú collectionsrrûrÕÚextendÚsortedrÔrÎrÏÚsubrŒrÃršrrr\r·Údirnamer”r•rÌr Údict)r¦Ú basenamesZ basenames2ÚreplrƒZaltnameÚbaser\r¥Ú unit_namerWrVÚlabelrÁZ trip_pathsZ trip_pointsZ trip_pointZ trip_typer?r?r@Úsensors_temperaturesÒsŽ                    rcc 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)rt)r«rHr?r?r@r¬Tsz sensors_fans..rSz ignoring %rNrƒF)r™rTr")r˜r™)rXrrûrÕrZrÔr¯ršr”r•r¸r¹rºrrr\r·r\rŒrZsfanr])r¦r^r`r¥rÁrarbr?r?r@Ú sensors_fansCs    rdc 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é<)ÚobjectrrrüÚPOWER_SUPPLY_PATHr\r·rZÚZeroDivisionErrorr¯ršrÍrZPOWER_TIME_UNLIMITEDZPOWER_TIME_UNKNOWNZsbattery) rhZbatsrFZ energy_nowZ power_nowZ energy_fullZ time_to_emptyrPZ power_pluggedZonlinerZsecsleftr?)rgr@Úsensors_batterycs`              rmc 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Œ) rPZrawlistÚitemrlZttyZhostnameZtstampZ user_processr¢Úntr?r?r@rnÁs rnc 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“rtÚ BOOT_TIMEr)r\rŽr³r¦r?r?r@Ú boot_timeÓs    rrcCsdd„t ttƒƒ¡DƒS)z7Returns a list of PIDs currently running on the system.cSsg|]}| ¡rt|ƒ‘qSr?)rer¯)r«rHr?r?r@r¬èszpids..)rrrü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¯rtrÌÚEnvironmentErrorr)r¢r\rŽr³Ztgidr?r?r@rsës      rsc 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-rtr¯)r¦rr¢rŽÚdataÚrparZdsetÚppidr?r?r@Úppid_map s    rycst ˆ¡‡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 rrrrr\rßrø)rùÚargsÚkwargs)Úfunr?r@Úwrapper%sz wrap_exceptions..wrapper)Ú functoolsÚwraps)r}r~r?)r}r@Úwrap_exceptions!src@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¢rzÚ_ppidrøÚ_cachecCs||_d|_d|_tƒ|_dS)N)r¢rzrƒ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)rrrBrø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/statNruó(rr:rƒrrrxr#Úttynré Úutimeé Ústimeé Úchildren_utimer7Úchildren_stimeéÚ create_timeé$Úcpu_numé'Ú blkio_ticks)rrør¢r’r-Úfindrt)rùrŽrvrwrƒrr¦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ùrŽr?r?r@Ú_read_status_filejszProcess._read_status_filec Cs0td|j|jftd}| ¡ ¡SQRXdS)Nz %s/%s/smaps)r)rrør¢rr’r“)rùrŽr?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")rsrør¢rr rrr\Úlexistsrsrrzrrƒ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’rurtr‹)rùrŽrvÚsepÚcmdliner?r?r@ržžs    zProcess.cmdlinec Cs0td|j|jfƒ}| ¡}WdQRXt|ƒS)Nz %s/%s/environ)rrør¢r’r)rùrŽrvr?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“rtrÌr¯rrjr®)rùr—rrŽr³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‰r‹rrŽr”)r–rÃrÄrk)rùrr‰r‹rrŽrpr?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¢rz)rùZtimeoutr?r?r@Úwaitösz Process.waitcCs&t| ¡dƒ}tptƒ}|t|S)Nr)rÃr–rqrrrÄ)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Šrtr`) rùrŽZvmsrfrWÚtextÚlibrvZdirtyr?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×r.r¯Ú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)rtruÚpoprŒr¯rÌr©)r/Ú current_blockrvr³rr?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˜rtr©rÌr!r r“rurrŒr­)rùr«rvr/rØZ first_linerªÚheaderZhfieldsrZpermsÚoffsetZdevrÿr\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) rsrør¢rr rsrrzrrƒ)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_rervZctxswr?r?r@Únum_ctx_switches‹s zProcess.num_ctx_switchessThreads:\t(\d+)cCs| ¡}t| |¡dƒS)Nr)r—r¯r¦)rùZ_num_threads_rervr?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/statTrur:r½rˆrŠ)rrrürør¢Úsortrr’r“rr•rtrÃrÄrZpthreadr¯rŒr…) rùZ thread_idsrPÚ hit_enoentZ thread_idr—rŽÚstrr‰r‹rRr?r?r@Úthreads¡s,   zProcess.threadscCs t |j¡S)N)r3Ú getpriorityr¢)rùr?r?r@Únice_get½szProcess.nice_getcCst |j|¡S)N)r3Ú 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¯r‹rÉ)rùZ_rervrÐ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ÌÚ isinstancer¨rýr¼Útuplerâr‹rÉ)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Ìr›r‹r%r•r¨ZENOSYSrsrrzrƒ)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@rs 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†)rrrürør¢rsrr r•r¨rýr©rrr¯rŠrtr~r[rŒr…) rùrPrGr´r]rr\rÁrŽÚposr_r^rRr?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)r‹rrrürør¢)rùr?r?r@Únum_fdsXszProcess.num_fdscCst| ¡dƒS)Nrx)r¯r–)rùr?r?r@rx\sz Process.ppidsUid:\t(\d+)\t(\d+)\t(\d+)cCs6| ¡}| |¡d\}}}t t|ƒt|ƒt|ƒ¡S)Nr)r—r¦rZpuidsr¯)rùZ_uids_rervÚ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_rervrËrÌrÍr?r?r@Úgidsfsz Process.gids)N)N)rò)8r<r=r>r(Ú __slots__rúr…rrr–r—r˜r™ršrƒrœržrŸr rrr\rßÚgetpidr¡rÆr’r¢rr¥Ú HAS_SMAPSrÎrÏr§r¯r°r±r²r¶r¸rºÚHAS_CPU_AFFINITYr»r¼r¿ÚHAS_PROC_IO_PRIORITYrÂrÃr›rÄrrÈrÉrÊrxrÎrÏr?r?r?r@r‚6sz"          D           ,   r‚)N)rò)F)F)¤r(Z __future__rr rXr¨rrÕrrrÎrór ÚsysÚ tracebackr¸rrr"rrrr¾r r3r r r r rrrrrrrrrrrrrrZ_compatrrrrr r!Ú version_inforÀZ__extra__all__rkr\rßrÑrÒÚhasattrrÔrÓrjr–rËrÄZ getpagesizer°rqrÚ byteorderr rIZ 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·rhrjrkrsr~r„r‘ršÚ ExceptionÚ print_excr‰r›ÚresourceÚ ImportErrorržZCDLLr rYÚdirrµr¼rÂrÆrÉrÓrÝrÞræZ net_if_addrsrèrér*r+r1r5Z disk_usagerKrOrcrdrmrnrrrrsryrr‚r?r?r?r@Úsf                                                    4z:*   k % _ +q ^