§ <ˆj�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)ddlm*Z*ddlm+Z+ddl,m-Z-dd l,m.Z.dd!l,m/Z/dd"l,m0Z0dd#l,m1Z1dd$l,m2Z2e j3d%krddl4Z4ndZ4gd&¢Z5d'Z6ej7 8d(ej9¦«z¦«Z:ej7 8d)ej9¦«z¦«Z;eej?d,¦«Z@ejA¦«ZBdaCe jDd-kZEd.ZFe4€e jGZHn(e4jId/d0eJe jG¦«i¦«ZKeKjHZHe4€ dZLdZMd1ZNd2ZOn5Gd3„d4e4jI¦«ZPeQ¦« RePjS¦«ejTejUejVejWejXejYejZejZej[ej\ej]ej^d5œ Z_ej`ejaejbejcejdejeejfejgejhejiejjd6œ Zked7gd8¢¦«Zled9gd:¢¦«Zmed;gd<¢¦«Zned=d>¦«Zoed?eojpd@z¦«ZqedAgdB¢¦«ZredCdDdE serjp¦«z¦«ZtedFgdG¢¦«ZuedHgdI¢¦«ZvdJ„ZwdK„ZxdL„Zye$dM„¦«Zz ezdN¦«n1#e{$r)e j|¦«edOdP¦«dQdQdQ¦«a}YnwxYwdZ~ ddRlm~Z~n1#e€$r)ddl�Z�e�j‚ddS¬T¦«Zƒe.StructRlimitÚrlim_curÚrlim_maxN)r@rArBÚctypesÚ c_longlongÚ_fields_rCrDrEÚ StructRlimitrÊ9s+€€€€€Ø'¨Ô):Ð;Ø'¨Ô):Ð;ð=���rDrÐrr) rÍÚ StructureÚlibcrÆÚbyrefrËrÌÚ get_errnoÚOSErrorr—Ústrerror)ÚpidÚ resource_ÚlimitsrÐÚcurrentÚretÚnewÚerrno_s rErÆrÆ8sý€ð =ð =ð =ð =ð =�vÔ/ñ =ô =ð =ð#�l‘n”nˆG؈~å—l’l 3¨ °4½¼ÀgÑ9NÔ9NÑOÔO��ð#�l‘n”n�Ø% aœy�” Ø% aœy�” Ý—l’lؘ¥F¤L°Ñ$5Ô$5µv´|ÀGÑ7LÔ7LñNôN�ð�aŠxˆxÝÔ)Ñ+Ô+�ݘf¥b¤k°&Ñ&9Ô&9Ñ:Ô:Ð:ØÔ$ gÔ&6Ð7Ð 7rDcód—g|]-}| d¦«¯| ¦«¯+|‘Œ.S)ÚRLIM)Ú startswithÚisupper©Ú.0rMs rEú räQs6€ÐFÐFÐFˆq §¢¨fÑ!5Ô!5ÐF¸!¿)º)¹+¼+ÐFˆÐFÐFÐFrDcóà—|d}|| dd¦«z} |d}|d}|d}n6#t$r)}td|jdz¦«|cYd}~Sd}~wwxYw t d t ¦«z¦«}n#t $r|cYSwxYwd}|5|D]U} |  ¦«} |  d ¦«r*|t|   ¦«d ¦«z }ŒV ddd¦«n #1swxYwY|tz}||z } ||z} | t| d z |¦«z} | | z } | |t|d z |¦«z z } t| ¦«S)axFallback 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%r is missing from /proc/meminfo; using an approximation for calculating available memoryNz %s/zoneinfoslowrr=g@) ÚgetÚKeyErrorrÚargsrrÚIOErrorÚstripràÚintr™ÚPAGESIZEÚmin) ÚmemsrbÚfallbackÚlru_active_fileÚlru_inactive_fileÚslab_reclaimableÚerrr¿Ú watermark_lowÚlineÚavailÚ pagecaches rEÚcalculate_avail_vmemrûYs€ð< � Ô €DØ�d—h’h˜z¨1Ñ-Ô-Ñ-€HðØÐ/Ô0ˆØ Ð!3Ô4ÐØÐ 0Ô1ÐÐøÝ ðððÝ ð1Ø36´8¸A´;ñ?ñ @ô @ð @àˆˆˆˆˆˆøøøøðøøøðÝ ˜ ­Ñ(9Ô(9Ñ9Ñ :Ô :ˆˆøÝ ðððØˆˆˆðøøøð€MØ ð6ð6Øð 6ð 6ˆDØ—:’:‘<”<ˆDØ�Š˜vÑ&Ô&ð 6Ø¥ T§Z¢Z¡\¤\°!¤_Ñ!5Ô!5Ñ5� øð 6ð6ð6ð6ñ6ô6ð6ð6ð6ð6ð6ð6øøøð6ð6ð6ð6ð •XÑ€Mà �=Ñ €EØÐ"3Ñ3€IØ •�Y ‘] MÑ2Ô2Ñ2€IØ ˆYÑ€EØ Ð ¥Ð$4°sÑ$:¸MÑ JÔ JÑ JÑJ€EÝ ˆu‰:Œ:Ðs@£<¼ A/ÁA*Á$A/Á*A/Á3B B! B!Â(ADÄDÄDc óØ—g}i}tdt¦«z¦«5}|D]7}| ¦«}t|d¦«dz||d<Œ8 ddd¦«n #1swxYwY|d}|d} |d}n'#t$rd}| d ¦«YnwxYw |d }|| d d¦«z }n'#t$rd}| d ¦«YnwxYw |d } nA#t$r4 |d} n'#t$rd} | d¦«YnwxYwYnwxYw |d} n'#t$rd} | d¦«YnwxYw |d} nS#t$rF |d|dz|dz} n'#t$rd} | d¦«YnwxYwYnwxYw |d} n#t$rd} YnwxYw||z |z |z } | dkr||z } |d}|dkrt|¦«}n#t$rt|¦«}YnwxYw|dkrd}| d¦«n||kr|}t||z |d¬¦«}|rLd  |¦«›dt|¦«dkrdnd›d�}tj |td ¬!¦«t|||| || | ||| | ¦ « S)"a8Report virtual memory stats. This implementation mimicks 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érNs MemTotal:ræsBuffers:rerçrèrfsShmem:s MemShared:rgsActive:rcs Inactive:s Inact_dirty:s Inact_clean:sInact_laundry:rdsSlab:s MemAvailable:r_©Úround_ú, z) memory stats couldn't be determined and ÚwasÚwerez set to 0r=©Ú stacklevel)rrr™rîrêr½rérûrÚjoinr¼ÚwarningsÚwarnÚRuntimeWarningr])Úmissing_fieldsrñr¿rørÁr^rbrerfrgrcrdrhrarùr`Úmsgs rEÚvirtual_memoryr –sl€ð€NØ €DÝ �\¥OÑ$5Ô$5Ñ5Ñ 6Ô 6ð4¸!Øð 4ð 4ˆDØ—Z’Z‘\”\ˆFÝ! &¨¤)™nœn¨tÑ3ˆD�˜”‰OˆOð 4ð4ð4ð4ñ4ô4ð4ð4ð4ð4ð4ð4øøøð4ð4ð4ð4ð �Ô €EØ � Ô €Dð)Ø�{Ô#ˆˆøÝ ð)ð)ð)àˆØ×Ò˜iÑ(Ô(Ð(Ð(Ð(ð)øøøð 0Ø�jÔ!ˆð �$—(’(Ð+¨QÑ/Ô/Ñ/ˆˆøõ ð(ð(ð(؈Ø×Ò˜hÑ'Ô'Ð'Ð'Ð'ð(øøøð,Ø�i”ˆˆøÝ ð,ð,ð,ð ,ؘ-Ô(ˆFˆFøÝð ,ð ,ð ,؈FØ × !Ò ! (Ñ +Ô +Ð +Ð +Ð +ð ,øøøøøð,øøøð(Ø�jÔ!ˆˆøÝ ð(ð(ð(؈Ø×Ò˜hÑ'Ô'Ð'Ð'Ð'ð(øøøð .ؘ Ô%ˆˆøÝ ð.ð.ð.ð .à�_Ô%Ø�_Ô%ñ&àÐ&Ô'ñ(ð ˆHøõð .ð .ð .؈HØ × !Ò ! *Ñ -Ô -Ð -Ð -Ð -ð .øøøøøð .øøøðØ�HŒ~ˆˆøÝ ðððØˆˆˆðøøøð �4‰<˜&Ñ  7Ñ *€DØ ˆa‚x€xð�t‰|ˆð /ØÐ%Ô&ˆð �AŠ:ˆ:õ )¨Ñ.Ô.ˆEøøõ ð+ð+ð+Ý$ TÑ*Ô*ˆˆˆð+øøøð ˆq‚y€y؈Ø×Ò˜kÑ*Ô*Ð*Ð*Ø �Šˆð ˆå˜U U™]¨U¸1Ð=Ñ=Ô=€Gðð9à �IŠI�nÑ %Ô %Ð %Ð %ݘÑ(Ô(¨AÒ-Ð-ˆEˆE°6Ð 9Ð 9ð;ˆõ Œ �c�>°aÐ8Ñ8Ô8Ð8å �˜˜w¨¨dؘ 7¨F°F¸Dñ Bô BðBs×£;A+Á+A/Á2A/ÂBÂ!B4Â3B4Â8CÃ!C>Ã=C>ÄD Ä E ÄDÄE Ä!EÅE ÅEÅE ÅE Å EÅ!E:Å9E:Å>FÆ GÆF-Æ,GÆ-!GÇGÇGÇGÇGÇG$Ç$ G3Ç2G3È H+È+IÉIcóL—i}tdt¦«z¦«5}|D]7}| ¦«}t|d¦«dz||d<Œ8 ddd¦«n #1swxYwY |d}|d}n5#t$r(t j¦«\}}}}}}}||z}||z}YnwxYw||z }t||d¬¦«} td t¦«z¦«}|5dx} } |D]�}| d ¦«r/t| d ¦«d¦«d zdz} nC| d ¦«r.t| d ¦«d¦«d zdz} | �| �n#Œ�d} tj | td¬¦«dx} } ddd¦«n #1swxYwYnI#t$r<} dt| ¦«z} tj | td¬¦«dx} } Yd} ~ nd} ~ wwxYwtj|||| | | ¦«S)zReturn swap memory metrics.rýrrþrNs SwapTotal:s SwapFree:rÿz %s/vmstatspswpinó r&spswpoutzK'sin' and 'sout' swap memory stats couldn't be determined and were set to 0r=rzP'sin' and 'sout' swap memory stats couldn't be determined and were set to 0 (%s))rrr™rîrêÚcextÚ linux_sysinforràrrr rìÚstrrÚsswap)rñr¿rørÁr^rbÚ_Úunit_multiplierrar`ÚsinÚsoutr rös rEÚ swap_memoryrsÿ€à €DÝ �\¥OÑ$5Ô$5Ñ5Ñ 6Ô 6ð4¸!Øð 4ð 4ˆDØ—Z’Z‘\”\ˆFÝ! &¨¤)™nœn¨tÑ3ˆD�˜”‰OˆOð 4ð4ð4ð4ñ4ô4ð4ð4ð4ð4ð4ð4øøøð4ð4ð4ð4ð Ø�]Ô#ˆØ�LÔ!ˆˆøÝ ð ð ð Ý37Ô3EÑ3GÔ3GÑ0ˆˆ1ˆa��E˜4 Ø �Ñ ˆØ �шˆˆð øøøð �4‰<€DݘD %°Ð2Ñ2Ô2€GðÝ ˜ ¥oÑ&7Ô&7Ñ7Ñ 8Ô 8ˆðð ð ØÐ ˆC�$Øð ð �ð—?’? 9Ñ-Ô-ð?ݘdŸjšj¨Ñ.Ô.¨qÔ1Ñ2Ô2°QÑ6¸Ñ=�C�CØ—_’_ ZÑ0Ô0ð?ݘtŸzšz¨$Ñ/Ô/°Ô2Ñ3Ô3°aÑ7¸$Ñ>�DØ�? tÐ'7Ø�Eøð 8�å” ˜c¥>¸aÐ@Ñ@Ô@Ð@Ø���dð% ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð øøõ ðððð5Ý7:¸3±x´xñ@ˆåŒ �c�>°aÐ8Ñ8Ô8Ð8؈ˆˆdˆdˆdˆdˆdˆdøøøøð øøøõ4 Œ=˜  d¨G°S¸$Ñ ?Ô ?Ð?sN¡;A)Á)A-Á0A-Á5BÂ/B8Â7B8ÃGÃ3B9F8Æ8F<Æ?F<Ç H Ç2HÈH cóN—t¦«}t|¦«td|z¦«5}| ¦« ¦«}ddd¦«n #1swxYwY|dt t j¦«dz…}d„|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¯Nrcó<—g|]}t|¦«tz ‘ŒSrC©ÚfloatÚ CLOCK_TICKSrâs rEräzcpu_times..Ts#€Ð 5Ð 5Ð 5¨�e�A‰hŒh�Ñ$Ð 5Ð 5Ð 5rD)rrÃrr»r™r¼rºÚ_fields)r¾r¿rÀrÁs rEÚ cpu_timesrHsØ€õ"Ñ#Ô#€KݘÑ%Ô%Ð%Ý �Y Ñ,Ñ -Ô -ð&°Ø—’‘”×#Ò#Ñ%Ô%ˆð&ð&ð&ñ&ô&ð&ð&ð&ð&ð&ð&øøøð&ð&ð&ð&à �A•c�)Ô+Ñ,Ô,¨qÑ0Ð0Ô 1€FØ 5Ð 5¨fÐ 5Ñ 5Ô 5€FÝ �fÐ Ðs°'A#Á#A'Á*A'có¼—t¦«}t|¦«g}td|z¦«5}| ¦«|D]y}| d¦«rb| ¦«}|dt tj¦«dz…}d„|D¦«}t|Ž}|  |¦«Œz|cddd¦«S#1swxYwYdS)zfReturn a list of namedtuple representing the CPU times for every CPU available on the system. r¯scpurcó<—g|]}t|¦«tz ‘ŒSrCrrâs rEräz!per_cpu_times..fs#€ÐAÐAÐA°Q�% ™(œ(¥[Ñ0ÐAÐAÐArDN) rrÃrr»ràr™r¼rºrr½)r¾Úcpusr¿rørÀrÁÚentrys rEÚ per_cpu_timesr#Xs%€õ"Ñ#Ô#€KݘÑ%Ô%Ð%Ø €DÝ �Y Ñ,Ñ -Ô -ð °à � Š ‰ Œ ˆ Øð #ð #ˆDØ�Š˜vÑ&Ô&ð #ØŸš™œ�Ø ¥#¥iÔ&7Ñ"8Ô"8¸1Ñ"<Ð <Ô=�ØAÐA¸&ÐAÑAÔA�Ý! 6Ð*�Ø— ’ ˜EÑ"Ô"Ð"øØð ð ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð ð s²BCÃCÃCcóN— tjd¦«S#t$�rd}tdt ¦«z¦«5}|D].}| ¦« d¦«r|dz }Œ/ ddd¦«n #1swxYwY|dkr…tjd¦«}tdt ¦«z¦«5}|D]7}|  d ¦«d}|  |¦«r|dz }Œ8 ddd¦«n #1swxYwY|dkrYdS|cYSwxYw) z0Return the number of logical CPUs in the system.ÚSC_NPROCESSORS_ONLNrú %s/cpuinfos processorrNzcpu\dr¯rˆ) r—ÚsysconfÚ ValueErrorrrÚlowerràÚreÚcompilerr™Úmatch)Únumr¿røÚsearchs rEÚcpu_count_logicalr/lsÅ€ðÝŒzÐ/Ñ0Ô0Ð0øÝ ðñðàˆÝ ˜­Ñ(9Ô(9Ñ9Ñ :Ô :ð ¸aØð ð �Ø—:’:‘<”<×*Ò*¨<Ñ8Ô8ðؘ1‘H�Cøð ð ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð �!Š8ˆ8Ý”Z Ñ)Ô)ˆFݘ9¥Ñ'8Ô'8Ñ8Ñ9Ô9ð !¸QØð!ð!�DØŸ:š: c™?œ?¨1Ô-�DØ—|’| DÑ)Ô)ð!ؘq™˜øð!ð !ð !ð !ñ !ô !ð !ð !ð !ð !ð !ð !øøøð !ð !ð !ð !ð �!Š8ˆ8à�4�4؈ ˆ ˆ ð-øøøs]‚–+D$Á2BÁ4 D$ÂB ÂD$ÂB Â;D$Ã;D Ã? D$Ä D ÄD$ÄD Ä D$ÄD$Ä#D$cóP—t¦«}d}d}tj|¦«ptj|¦«D]b}t|¦«5}| | ¦« ¦«¦«ddd¦«n #1swxYwYŒct |¦«}|dkr|Si}i}tdt¦«z¦«5}|D]�}| ¦« ¦«}|s& |d||d<n#t$rYnwxYwi}ŒP|  d¦«r+|  d d ¦«\} } t| ¦«|| <Œ‘ ddd¦«n #1swxYwYt| ¦«¦«}|pdS) 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_listNrr&ó cpu coresó physical id)r2r1s :r)ÚsetÚglobrÚaddÚreadrír¼rr)rêràr™rîÚsumrÀ) ÚlsÚp1Úp2rtr¿ÚresultÚmappingÚ current_inforøÚkeyÚvalues rEÚcpu_count_coresr@‰s0€õ ‰Œ€Bð E€BØ J€BÝ” ˜"‘ ” Ð.¥¤¨2¡¤ð%ð%ˆÝ ˜Ñ Ô ð % !Ø �FŠF�1—6’6‘8”8—>’>Ñ#Ô#Ñ $Ô $Ð $ð %ð %ð %ñ %ô %ð %ð %ð %ð %ð %ð %øøøð %ð %ð %ð %øå �‰WŒW€FØ �‚{€{؈ ð€GØ€LÝ �\¥OÑ$5Ô$5Ñ5Ñ 6Ô 6ð3¸!Øð 3ð 3ˆDØ—:’:‘<”<×%Ò%Ñ'Ô'ˆDØð 3ðà$ \Ô2ð˜L¨Ô8Ñ9Ð9øåðððØ�Dðøøøà!� � ð—?’?Ð#AÑBÔBð3Ø!%§¢¨F°AÑ!6Ô!6‘J�C˜Ý(+¨E© ¬ �L Ñ%øð 3ð3ð3ð3ñ3ô3ð3ð3ð3ð3ð3ð3øøøð3ð3ð3ð3õ"�—’Ñ!Ô!Ñ "Ô "€FØ ˆ>�TÐsIÁ :BÂB ÂB Ã-E8ÄDÄE8Ä D$Ä!E8Ä#D$Ä$AE8Å8E<Å?E<có2—tdt¦«z¦«5}d}d}d}|D]À}| d¦«r(t| ¦«d¦«}ny| d¦«r(t| ¦«d¦«}n<| d¦«r't| ¦«d¦«}|�|�|�nŒÁddd¦«n #1swxYwYd}t j||||¦«S)z*Return various CPU stats as a named tuple.r¯Nsctxtrsintrssoftirqr)rrràrîr™rÚ scpustats)r¿Ú ctx_switchesÚ interruptsÚsoft_interruptsrøÚsyscallss rEÚ cpu_statsrG³sR€å �Y¥Ñ!2Ô!2Ñ2Ñ 3Ô 3ð °q؈ ؈ ؈Øð ð ˆDØ�Š˜wÑ'Ô'ð 7Ý" 4§:¢:¡<¤<°¤?Ñ3Ô3� � Ø—’ Ñ)Ô)ð 7Ý  §¢¡¤¨a¤Ñ1Ô1� � Ø—’ Ñ,Ô,ð 7Ý"% d§j¢j¡l¤l°1¤oÑ"6Ô"6�ØÐ'¨OÐ,GØ"Ð.Ø�øð ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð€HÝ Ô Ø�j /°8ñ =ô =ð=sŸC C5Ã5C9Ã<C9c óH—g}tdt¦«z¦«5}|D]e}| ¦« d¦«r<| t | dd¦«d¦«¦«Œf ddd¦«n #1swxYwY|S)zzcpu_freq..Þs&€¥¥R¤Y¨y¸!Ñ%<Ô%<×%BÒ%BÑ%DÔ%DÑ!EÔ!E€rD)r>ièÚscaling_cur_freqN©ròÚcpuinfo_cur_freqz!can't find current frequency fileÚscaling_max_freqÚscaling_min_freq)rJr4Úsortr—rtrÚ enumerater¼rÚNotImplementedErrorrîr½rÚscpufreq) Ú cpuinfo_freqsÚpathsrÛÚpjoinÚirtÚcurrÚmax_Úmin_s rEÚcpu_freqr_Õs‹€õ .Ñ/Ô/ˆ å ŒIÐDÑ EÔ Eð CÝ ŒIÐAÑ BÔ Bð ð � Š ÐEÐEˆ ÑFÔFÐF؈ݔ” ˆÝ  Ñ'Ô'ð ;ñ ;‰GˆAˆtÝ�5‰zŒz�S Ñ/Ô/Ò/Ð/ð% QÔ'¨$Ñ.��å˜E˜E $Ð(:Ñ;Ô;ÀdÐKÑKÔK�؈|õ˜E˜E $Ð(:Ñ;Ô;ÀdÐKÑKÔK�Ø�<Ý-Ø;ñ=ô=ð=å�t‘9”9˜tÑ#ˆDÝ•t˜E˜E $Ð(:Ñ;Ô;Ñ<Ô<Ñ=Ô=ÀÑDˆDÝ•t˜E˜E $Ð(:Ñ;Ô;Ñ<Ô<Ñ=Ô=ÀÑDˆDØ �JŠJ•wÔ'¨¨d°DÑ9Ô9Ñ :Ô :Ð :Ñ :؈ rDcó2—d„t¦«D¦«S)z}Alternate implementation using /proc/cpuinfo. min and max frequencies are not available and are set to None. có:—g|]}tj|dd¦«‘ŒS)rÅ)rrWrâs rEräzcpu_freq..ús'€ÐMÐMÐM°•Ô   B¨Ñ+Ô+ÐMÐMÐMrD)rJrCrDrEr_r_ös €ðNÐMÕ5JÑ5LÔ5LÐMÑMÔMÐMrDcó—eZdZdS)Ú_Ipv6UnsupportedErrorN)r@rArBrCrDrErcrcs€€€€€Ø€DrDrccór—eZdZdZd„Zd„Zd„Zed„¦«Zed d„¦«Z ed d„¦«Z d d „Z dS) Ú 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 óL—dtjtjf}dtjtjf}dtjtjf}dtjtjf}dtjdf}|||||f||f|f|f||f|f|f|f||||f||f||fdœ |_d|_dS)NÚtcpÚtcp6ÚudpÚudp6Úunix) ÚallrgÚtcp4rhriÚudp4rjrkÚinetÚinet4Úinet6)ÚsocketÚAF_INETÚ SOCK_STREAMÚAF_INET6Ú SOCK_DGRAMÚAF_UNIXÚtmapÚ _procfs_path)Úselfrmrhrnrjrks rEÚ__init__zConnections.__init__sÀð•v”~¥vÔ'9Ð:ˆØ�œ­Ô);Ð<ˆØ•v”~¥vÔ'8Ð9ˆØ�œ­Ô):Ð;ˆØ�œ¨Ð-ˆà˜$  d¨DÐ1ؘ$�<Ø�GØ�Gؘ$�<Ø�GØ�GØ�Gؘ4  tÐ,ؘD�\ؘD�\ð  ð  ˆŒ ð!ˆÔÐÐrDcó—tt¦«}tj|j›d|›d�¦«D]Ø} t |j›d|›d|›�¦«}| d¦«r<|dd…dd…}|| |t|¦«f¦«Œq#ttf$rYŒ„t$rI}|j tj krYd}~Œ§|j tjkrt|¦«Yd}~ŒÐ‚d}~wwxYw|S)Nr§ú/fdú/fd/zsocket:[r´éÿÿÿÿ)rÚlistr—Úlistdirryr˜ràr½rîr r"rÕÚerrnoÚEINVALÚ ENAMETOOLONGr)rzr×ÚinodesruÚinoderös rEÚget_proc_inodeszConnections.get_proc_inodes,s<€Ý�TÑ"Ô"ˆÝ”*¨4Ô+<Ð+<Ð+<¸c¸c¸cÐBÑCÔCð 9ð 9ˆBð 9Ý °$Ô2CÐ2CÐ2CÀSÀSÀSÈ"È"Ð!MÑNÔN�ð ×#Ò# JÑ/Ô/ð9à! ! " "œI c r cœN�Eؘ5”M×(Ò(¨#­s°2©w¬w¨Ñ8Ô8Ð8øøõ%&Õ'9Ð:ð ð ð ð�Ýð ð ð Ø”9¥¤ Ò,Ð,à�H�H�H�HØ”9¥Ô 2Ò2Ð2å˜#‘J”J�JØ�H�H�H�HØøøøøð øøøðˆ s)·B%Â%D Â8 D ÃDÃ$DÄDÄD có¸—i}t¦«D]H} | | |¦«¦«Œ,#ttt f$rYŒEwxYw|S©N)ÚpidsÚupdater‡r r"r!)rzr…r×s rEÚget_all_inodeszConnections.get_all_inodesFss€ØˆÝ‘6”6ð ð ˆCð Ø— ’ ˜d×2Ò2°3Ñ7Ô7Ñ8Ô8Ð8Ð8øÝ%Õ'9½?ÐKð ð ð ð�ð øøøðˆ s”(=½AÁAc ó(—| d¦«\}}t|d¦«}|sdStr| d¦«}|tjkr`t r1t j|tj |¦«ddd…¦«}nît j|tj |¦«¦«}nÆtj |¦«} t rCt jtj tj dgtj d|¦«¢Rަ«}nBt jtj tj dgtj d|¦«¢Rަ«}n$#t$rt¦«st ‚‚wxYwt#j||¦«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 ú:érCÚasciiNrz>4Iz<4I)r™rîrÚencoderrrsÚ LITTLE_ENDIANÚ inet_ntopÚbase64Ú b16decoderuÚstructÚpackÚunpackr(rrcrÚaddr)r™ÚfamilyÚipÚports rEÚdecode_addresszConnections.decode_addressVsˆ€ð"—:’:˜c‘?”?‰ˆˆDÝ�4˜‰}Œ}ˆðð Ø�2Ý ð $Ø—’˜7Ñ#Ô#ˆBØ •V”^Ò #Ð #åð DÝÔ% f­fÔ.>¸rÑ.BÔ.BÀ4À4ÀRÀ4Ô.HÑIÔI��åÔ% f­fÔ.>¸rÑ.BÔ.BÑCÔC��åÔ! "Ñ%Ô%ˆBð å ðGÝÔ)ݜݜ  EÐE­F¬M¸%ÀÑ,DÔ,DÐEÐEÐEñGôG�B�Bõ Ô)ݜݜ  EÐE­F¬M¸%ÀÑ,DÔ,DÐEÐEÐEñGôG�Bøøõð ð ð å$‘”ðÝ/Ð/àð  øøøõ Œ|˜B Ñ%Ô%Ð%s ÃB EÅ!E<Nc #óüK—| d¦«r!tj |¦«sdSt |¦«5}| ¦«t |d¦«D]õ\}} | ¦«dd…\ }} } } }}}}}} n&#t$rtd|›d|›d|›�¦«‚wxYw| |vr|| d\} }nd \} }|�|| krŒx|tj krt| } n tj} t | |¦«} t | |¦«} n#t"$rYŒæwxYw|||| | | | fV—Œö ddd¦«dS#1swxYwYdS) z.Parse /proc/net/tcp* and /proc/net/udp* files.Ú6Nrr¸úerror while parsing ú; malformed line rˆr©Nr)ršr—rtÚexistsrr»rUr™r(Ú RuntimeErrorrrrtÚ TCP_STATUSESrÚ CONN_NONErer�rc)ÚfileršÚtype_r…Ú filter_pidr¿ÚlinenorørÚladdrÚraddrÚstatusr†r×rus rEÚ process_inetzConnections.process_inet‰s.èè€ð �=Š=˜Ñ Ô ð ¥b¤g§n¢n°TÑ&:Ô&:ð à ˆFÝ �t‰_Œ_ð I Ø �JŠJ‰LŒLˆLÝ )¨!¨Q¡¤ð Ið I‘ �˜ð1àŸ š ™ œ  S b SÔ)ñB�A�u˜e V¨Q°°1°a¸¸E¸Eøå!ð1ð1ð1Ý&˜,à ˜D˜D & & &¨$¨$ð0ñ1ô1ð1ð1øøøð˜F�?�?ð% Uœm¨AÔ.‘G�C˜˜à&‘G�C˜ØÐ)¨j¸CÒ.?Ð.?Øà¥Ô 2Ò2Ð2Ý!-¨fÔ!5˜˜å!(Ô!2˜ð!Ý +× :Ò :¸5À&Ñ IÔ I˜Ý +× :Ò :¸5À&Ñ IÔ I˜˜øÝ0ð!ð!ð!Ø ˜ð!øøøà˜v u¨e°U¸FÀCÐHÐHÐHÐHÐHð= Ið Ið Ið Iñ Iô Ið Ið Ið Ið Ið Ið Ið Iøøøð Ið Ið Ið Ið Ið IsOÁ*E1Á3'BÂE1Â#B>Â>AE1Ä6EÅE1Å EÅE1ÅEÅE1Å1E5Å8E5c #ó"K—t|¦«5}| ¦«|D]Ì}| ¦«} |dd…\}}}}}}} n)#t$rd|vrYŒ:t d|›d|›�¦«‚wxYw| |vr || } ndg} | D]f\} } |�|| krŒt |¦«dkr |d } nd } t jt|¦«¦«}d }t j }| ||| ||| fV—ŒgŒÍ ddd¦«dS#1swxYwYdS) zParse /proc/net/unix files.rérˆr r¡r¢Nr´rÚ) rr»r™r(r¤r¼rÚsocktype_to_enumrîr¦)r§ršr…r©r¿røÚtokensrr¨r†Úpairsr×rurtr¬r­s rEÚ process_unixzConnections.process_unix±sÚèè€õ�t‰_Œ_ð! L Ø �JŠJ‰LŒLˆLØð Lð L�ØŸš™œ�ð)Ø28¸¸1¸´+Ñ/�A�q˜!˜Q  q¨%¨%øÝ!ð)ð)ð)Ø $��à ˜Ý&˜,à ˜D˜D $ $ð(ñ)ô)ð)ð )øøøð˜F�?�?ð# 5œM�E�Eà'˜L�EØ$ðLðL‘G�C˜Ø!Ð-°*ÀÒ2CÐ2CØ å˜v™;œ;¨!Ò+Ð+Ø#)¨"¤:˜D˜Dà#%˜DÝ 'Ô 8½¸U¹¼Ñ DÔ D˜ð!#˜Ý!(Ô!2˜Ø! 6¨5°$¸¸vÀsÐKÐKÐKÐKÐKðLð# Lð! Lð! Lð! Lñ! Lô! Lð! Lð! Lð! Lð! Lð! Lð! Lð! Løøøð! Lð! Lð! Lð! Lð! Lð! Ls6’-DÁAÁDÁA9Á!DÁ#A9Á9A=DÄDÄ Dc óΗ||jvr7td|›dd d„|jD¦«¦«›�¦«‚t¦«|_|�| |¦«}|sgSn| ¦«}t¦«}|j|D]¸\}}}|j›d|›�}|tj tj fvr|  |||||¬¦«} n|  ||||¬¦«} | D]U\} }}} } } }|rtj| ||| | | ¦«}ntj| ||| | | |¦«}| |¦«ŒVŒ¹t#|¦«S)Nzinvalid z kind argument; choose between rcó,—g|]}t|¦«‘ŒSrC)Úreprrâs rEräz(Connections.retrieve..Ús€Ð0LÐ0LÐ0L¸Qµ°a±´Ð0LÐ0LÐ0LrDz/net/)r©)rxr(rrryr‡rŒr3rrrsrur®rµrÚpconnÚsconnr5r€)rzÚkindr×r…rÛÚ proto_nameršr¨rtr8rur«r¬r­Ú bound_pidÚconns rEÚretrievezConnections.retrieve×sÈ€Ø �t”yÐ Ð Ý�*Ø $   d§i¢iÐ0LÐ0LÀ$Ä)Ð0LÑ0LÔ0LÑ&MÔ&MÐ&MðOñPôPð På+Ñ-Ô-ˆÔØ ˆ?Ø×)Ò)¨#Ñ.Ô.ˆFØð à� ð ð×(Ò(Ñ*Ô*ˆF݉eŒeˆØ)-¬°4¬ð ð Ñ %ˆJ˜ Ø"&Ô"3Ð"3Ð"3°Z°ZÐ@ˆDØ�&œ.­&¬/Ð:Ð:Ð:Ø×&Ò&ؘ& %¨¸Cð'ñAôA��ð×&Ò&ؘ& &°Sð'ñ:ô:�àFHð ð ÑB��F˜E 5¨%°¸Øð<Ý"œ=¨¨V°U¸EÀ5Ø)/ñ1ô1�D�Dõ#œ=¨¨V°U¸EÀ5Ø)/°ñ<ô<�Dà—’˜‘ ” � � ð õ�C‰yŒyÐrDr‰) r@rArBÚ__doc__r{r‡rŒÚ staticmethodr�r®rµr¿rCrDrErere sÅ€€€€€ð ð ð!ð!ð!ð.ððð4ððð ð0&ð0&ñ„\ð0&ðdð%Ið%Ið%Iñ„\ð%IðNð#Lð#Lð#Lñ„\ð#LðJðððððrDrerocó6—t |¦«S)z$Return system-wide open connections.)Ú _connectionsr¿)r»s rEÚnet_connectionsrÄús€å × Ò  Ñ &Ô &Ð&rDcó—tdt¦«z¦«5}| ¦«}ddd¦«n #1swxYwYi}|dd…D]´}| d¦«}|dksJt |¦«¦«‚|d|… ¦«}||dzd… ¦« ¦«}tt|¦«\}}} } } } } }}}}}}}}}||||| || |f||<Œµ|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¸rír™Úmaprî)r¿ÚlinesÚretdictrøÚcolonr«rÁÚ bytes_recvÚ packets_recvÚerrinÚdropinÚfifoinÚframeinÚ compressedinÚ multicastinÚ bytes_sentÚ packets_sentÚerroutÚdropoutÚfifooutÚ collisionsoutÚ carrieroutÚ compressedouts rEÚnet_io_countersrÜÿsj€õ �<¥/Ñ"3Ô"3Ñ3Ñ 4Ô 4ð¸Ø— ’ ‘ ” ˆðððñôððððððøøøððððà€GØ�a�b�b” ð9ð9ˆØ— ’ ˜3‘”ˆØ�qŠyˆyˆy�$˜t™*œ*‰yŒyˆyØ�F�U�FŒ|×!Ò!Ñ#Ô#ˆØ�e˜a‘i�j�jÔ!×'Ò'Ñ)Ô)×/Ò/Ñ1Ô1ˆõ&�c 6Ñ*Ô*ñ! ˆØ Ø Ø Ø Ø Ø Ø à Ø Ø Ø Ø Ø Ø Ø à# Z°¸|Ø ¨°ð9ˆ�‰ ˆ à €NsŸAÁAÁAcó*—tjttjttjt i}t¦« ¦«}i}|D]¸} tj |¦«}tj |¦«}tj |¦«\}}d  |¦«}d|v} tj| |||||¦«||<Œ}#t $r/} | jt"jkr‚t'| ¦«Yd} ~ Œ±d} ~ wwxYw|S)z)Get NIC stats (isup, duplex, speed, mtu).ú,ÚrunningN)rÚ DUPLEX_FULLr Ú DUPLEX_HALFr ÚDUPLEX_UNKNOWNr rÜÚkeysÚ cext_posixÚ net_if_mtuÚ net_if_flagsÚnet_if_duplex_speedrrÚ snicstatsrÕr‚ÚENODEVr) Ú duplex_mapÚnamesrÛr«ÚmturxÚduplexÚspeedÚ output_flagsÚisuprös rEÚ net_if_statsrñ$s€åÔ"¥OÝÔ"¥OÝÔ%Õ'9ð;€Jõ Ñ Ô × "Ò "Ñ $Ô $€EØ €CØð8ð8ˆð 8ÝÔ'¨Ñ-Ô-ˆCÝÔ+¨DÑ1Ô1ˆEÝ Ô4°TÑ:Ô:‰MˆF�EðŸ8š8 E™?œ?ˆLØ Ð%ˆDÝÔ)¨$° ¸6Ô0BÀEÈ3Ø*6ñ8ô8ˆC�‰IˆIøõð ð ð àŒy�EœLÒ(Ð(Øå�c‘ ” � � � � � � øøøøð  øøøð €JsÁ?Cà DÃ!%D Ä DFc ó¤—d„}d„}tj dt¦«z¦«r |¦«}nHtj d¦«r |¦«}nt dt¦«z¦«‚i}|D]C}|\ }}}} } } } } }}|st |¦«sŒ!| t z} | t z} ||| | | | | ||f ||<ŒD|S)zcReturn disk I/O statistics for every disk installed on the system as a dict of raw tuples. c 3ó¼K—tdt¦«z¦«5}| ¦«}ddd¦«n #1swxYwY|D�] }| ¦«}t |¦«}|dkrF|d}t |d¦«}t t |dd…¦«\ }}} } } } } }}}n‹|dks|dkr2|d}t t |dd…¦«\ }}}} } } } } }}}nM|dkr5|d}t t |dd…¦«\}}} } d x} x} x}x} }ntd |z¦«‚||| || | | || |f V—�Œ dS) Nú %s/diskstatsér%r=r&éér°rz!not sure how to interpret line %r)rrrÆr™r¼rîrÈr()r¿rÉrørÁÚflenr«ÚreadsÚ reads_mergedÚrbytesÚrtimeÚwritesÚ writes_mergedÚwbytesÚwtimerrrs rEÚ read_procfsz%disk_io_counters..read_procfsJsàèè€õ"�~­Ñ(9Ô(9Ñ9Ñ :Ô :ð "¸aØ—K’K‘M”MˆEð "ð "ð "ñ "ô "ð "ð "ð "ð "ð "ð "øøøð "ð "ð "ð "àð ;ñ ;ˆDØ—Z’Z‘\”\ˆFÝ�v‘;”;ˆDØ�rŠzˆzà˜a”y�ݘF 1œI™œ�å69½#¸vÀaÈÀd¼|Ñ6LÔ6Lñ4�˜v u¨f°mؘE 1 i°°Ø˜’�˜t ršz˜zà˜a”y�å69½#¸vÀaÈÀd¼|Ñ6LÔ6Lñ4�˜  f¨e°V¸]ؘE 1 i°°Ø˜’�à˜a”y�Ý03µC¸ÀÀÀ¼Ñ0DÔ0DÑ-��v˜v vØKLÐL�ÐL˜ÐL  ÐL¨}¸y¸yå Ð!DÀtÑ!KÑLÔLÐLؘ ¨°¸¸uØ ° ð;ð ;ð ;ð ;ñ ;ð+ ;ð ;s¡AÁAÁ Ac 3ó\K—tjd¦«D�]}tjtj d|¦«¦«D]Ý\}}}d|vrŒ t tj |d¦«¦«5}| ¦« ¦« ¦«}ddd¦«n #1swxYwYtj  |¦«}tt|dd…¦«\ }}} } } } } }}}||| | | | ||| |f V—ŒÞ�ŒdS)Nú /sys/blockÚstatr¸) r—r�Úwalkrtrrr6rír™ÚbasenamerÈrî)ÚblockÚrootrÚfilesr¿rÁr«rùrúrûrürýrþrÿrrrs rEÚ read_sysfsz$disk_io_counters..read_sysfsus}èè€Ý”Z  Ñ-Ô-ð Fñ FˆEÝ"$¤'­"¬'¯,ª,°|ÀUÑ*KÔ*KÑ"LÔ"Lð Fð F‘��a˜Ø Ð&Ð&ØÝ�rœwŸ|š|¨D°&Ñ9Ô9Ñ:Ô:ð6¸aØŸVšV™XœXŸ^š^Ñ-Ô-×3Ò3Ñ5Ô5�Fð6ð6ð6ñ6ô6ð6ð6ð6ð6ð6ð6øøøð6ð6ð6ð6å”w×'Ò'¨Ñ-Ô-�å36µs¸FÀ3ÀBÀ3¼KÑ3HÔ3Hñ1�˜  f¨e°V¸]ؘE 1 iؘU F¨F°F¸Eؘl¨M¸9ðFðFðFðFðFñ Fð Fð FsÂ9C à C ÃC rôrzC%s/diskstats nor /sys/block filesystem are available on this system)r—rtr£rrVr­ÚDISK_SECTOR_SIZE)Úperdiskrr ÚgenrÊr"r«rùrýrûrÿrürrúrþrrs rEÚdisk_io_countersrFs-€ð);ð);ð);ðV Fð Fð Fõ „w‡~‚~�n¥Ñ'8Ô'8Ñ8Ñ9Ô9ð*؈k‰mŒmˆˆÝ Œ�Š˜ Ñ %Ô %ð*؈j‰lŒlˆˆå!ð Ý&Ñ(Ô(ñ )ñ*ô*ð *ð€GØðAðAˆà(-ñ &ˆˆu�f˜f f¨e°U¸LØ ˜9Øð Õ0°Ñ6Ô6ð ð àÕ"Ñ"ˆØÕ"Ñ"ˆØ ¨°¸¸uØ% }°iðAˆ�‰ ˆ ð €NrDcó8—eZdZdZddgZd„Zd„Zd„Zd„Zd„Z d S) ÚRootFsDeviceFinderaEdisk_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Úminorcóœ—tjd¦«j}tj|¦«|_tj|¦«|_dS©Nr§)r—rÚst_devrr)rzÚdevs rEr{zRootFsDeviceFinder.__init__®s4€ÝŒg�c‰lŒlÔ!ˆÝ”X˜c‘]”]ˆŒ Ý”X˜c‘]”]ˆŒ ˆ ˆ rDcó.—tdt¦«z¦«5}| ¦«dd…D]¿}| ¦«}t |¦«dkrŒ*|d ¦«rt |d¦«nd}|d ¦«rt |d¦«nd}|d}||jkr ||jkr|rd|zccddd¦«SŒÀ ddd¦«dS#1swxYwYdS)Nz %s/partitionsr=r&rrr%ú/dev/%s) rrrÆr™r¼Úisdigitrîrr)rzr¿rørÁrrr«s rEÚask_proc_partitionsz&RootFsDeviceFinder.ask_proc_partitions³sq€Ý �­Ñ):Ô):Ñ:Ñ ;Ô ;ð 0¸qØŸ š ™ œ  a b bÔ)ð 0ð 0�ØŸš™œ�Ý�v‘;”; ’?�?ØØ*0°¬)×*;Ò*;Ñ*=Ô*=ÐG�˜F 1œI™œ˜À4�Ø*0°¬)×*;Ò*;Ñ*=Ô*=ÐG�˜F 1œI™œ˜À4�ؘa”y�ؘDœJÒ&Ð&¨5°D´JÒ+>Ð+>Øð0Ø(¨4Ñ/Ð/Ð/ð 0ð 0ð 0ð 0ñ 0ô 0ð 0ð 0øð 0ð 0ð 0ð 0ñ 0ô 0ð 0ð 0ð 0ð 0ð 0ð 0ð 0øøøð 0ð 0ð 0ð 0ð 0ð 0sŸCD Ã;D Ä DÄDcó6—d|j›d|j›d�}t|¦«5}|D]Y}| d¦«rB| ¦« d¦«d}|rd|zccddd¦«SŒZ ddd¦«dS#1swxYwYdS)Nz/sys/dev/block/rŽz/ueventzDEVNAME=r=r)rrrràríÚ rpartition)rzrtr¿rør«s rEÚask_sys_dev_blockz$RootFsDeviceFinder.ask_sys_dev_blockÀs€€Ø04´ ° ° ¸D¼J¸J¸JÐGˆÝ �t‰_Œ_ð 0 Øð 0ð 0�Ø—?’? :Ñ.Ô.ð0ØŸ:š:™<œ<×2Ò2°:Ñ>Ô>¸qÔA�DØð0Ø(¨4Ñ/Ð/Ð/ð  0ð 0ð 0ð 0ñ 0ô 0ð 0ð 0øð 0ð 0ð 0ð 0ñ 0ô 0ð 0ð 0ð 0ð 0ð 0ð 0ð 0øøøð 0ð 0ð 0ð 0ð 0ð 0s£ABÁ?BÂBÂBcóÆ—|j›d|j›�}tjd¦«}|D]¸} t |¦«}|5| ¦« ¦«}||krOtj  tj  |¦«¦«}d|zcddd¦«cS ddd¦«n #1swxYwYŒ©#t$rYŒµwxYwdS)NrŽz/sys/class/block/*/devr) rrr4Úiglobrr6rír—rtrÚdirnamer )rzÚneedler r§r¿Údatar«s rEÚask_sys_class_blockz&RootFsDeviceFinder.ask_sys_class_blockÉsO€Ø œJ˜J˜J¨¬ ¨ Ð3ˆÝ” Ð3Ñ4Ô4ˆØð 0ð 0ˆDð 0ݘd‘O”O�ðð0ð0ØŸ6š6™8œ8Ÿ>š>Ñ+Ô+�Dؘv’~�~Ý!œw×/Ò/µ´·²ÀÑ0EÔ0EÑFÔF˜Ø(¨4Ñ/ð 0ð0ð0ð0ñ0ô0ð0ð0ð0ð0à%ð0ð0ð0ñ0ô0ð0ð0ð0ð0ð0ð0øøøð0ð0ð0ð0øøõ%ð ð ð Ø�ð øøøð 0ð 0s#«C¼A-CÃC à C à CÃCcóò—d}|€C | ¦«}n-#ttf$r}t|¦«Yd}~nd}~wwxYw|€C | ¦«}n-#ttf$r}t|¦«Yd}~nd}~wwxYw|€C | ¦«}n-#ttf$r}t|¦«Yd}~nd}~wwxYw|�!t j |¦«r|SdSdSr‰) rrìrÕrrr#r—rtr£)rzrtrös rEÚfindzRootFsDeviceFinder.findØs7€ØˆØ ˆ<ð Ø×/Ò/Ñ1Ô1��øÝ�WÐ%ð ð ð Ý�c‘ ” � � � � � � øøøøð øøøà ˆ<ð Ø×-Ò-Ñ/Ô/��øÝ�WÐ%ð ð ð Ý�c‘ ” � � � � � � øøøøð øøøà ˆ<ð Ø×/Ò/Ñ1Ô1��øÝ�WÐ%ð ð ð Ý�c‘ ” � � � � � � øøøøð øøøð Ð ¥¤§¢¨tÑ 4Ô 4Р؈Kð Ð Ð Ð sD†›A¬AÁAÁ A Á B Á1BÂB ÂB%Â%CÂ6C à CN) r@rArBrÀÚ __slots__r{rrr#r%rCrDrErr¥su€€€€€ððð ˜'Ð"€Ið#ð#ð#ð 0ð 0ð 0ð0ð0ð0ð 0ð 0ð 0ðððððrDrc óœ—t¦«}t¦«}|s·td|z¦«5}|D]‰}| ¦«}| d¦«s(| | ¦«¦«ŒS| d¦«d}|dkr| d¦«ŒŠ ddd¦«n #1swxYwY|dkr?tj  d¦«r tj  d¦«}n"tj  d |z¦«}g}tj |¦«}|D]v} | \} } }} | d krd } | d vr"t¦« ¦«p| } |s | d ks||vrŒDdx} }tj| | || | |¦«}| |¦«Œw|S) z8Return mounted disk partitions as a list of namedtuples.z%s/filesystemsÚnodevú rÚzfsNrÄz /etc/mtabz%s/self/mountsÚnoner±)z /dev/rootÚrootfs)r3rrríràr5r™r—rtÚisfileÚrealpathrÚdisk_partitionsrr%rÚ sdiskpartr½)rlÚfstypesr¾r¿røÚfstypeÚ mounts_pathÚretlistÚ partitionsÚ partitionÚdeviceÚ mountpointÚoptsÚmaxfileÚmaxpathÚntuples rEr/r/ïs'€å‰eŒe€GÝ!Ñ#Ô#€KØ ð +Ý Ð'¨+Ñ5Ñ 6Ô 6ð +¸!Øð +ð +�Ø—z’z‘|”|�Ø—’ wÑ/Ô/ð+Ø—K’K § ¢ ¡ ¤ Ñ-Ô-Ð-Ð-ð"ŸZšZ¨Ñ-Ô-¨aÔ0�FØ ’�ØŸ š  EÑ*Ô*Ð*øð +ð +ð +ð +ñ +ô +ð +ð +ð +ð +ð +ð +øøøð +ð +ð +ð +ð�gÒÐ¥"¤'§.¢.°Ñ"=Ô"=ÐÝ”g×&Ò& {Ñ3Ô3ˆ ˆ å”g×&Ò&Ð'7¸+Ñ'EÑFÔFˆ à€GÝÔ% kÑ2Ô2€JØð ð ˆ Ø+4Ñ(ˆ� ˜F DØ �VÒ Ð ØˆFØ Ð,Ð ,Ð ,Ý'Ñ)Ô)×.Ò.Ñ0Ô0Ð:°FˆFØð ؘŠ|ˆ|˜v¨WÐ4Ð4ØØ Ð ˆ�'ÝÔ" 6¨:°v¸tØ#*¨Gñ5ô5ˆà�Š�vÑÔÐÐà €Ns±B C à CÃCc ó8 —tjt¦«}tjd¦«}| tjd¦«¦«t t d„|D¦«¦«¦«}tjd¦«}tjd¦«}|D]1}|  d|¦«}||vr|  |¦«Œ2|D�]a} |dz}tt|¦«¦«dz }tj tj |¦«d ¦«}t#|¦« ¦«} n#t&t(t*f$rYŒ wxYwt|d zd ¬ ¦«} t|d zd ¬ ¦«} t#|dzd¬ ¦« ¦«} | �& t| ¦«dz } n#t*$rd } YnwxYw| �& t| ¦«dz } n#t*$rd } YnwxYw||   | || | f¦«�Œc|�sNtjd¦«}t t |¦«¦«}|D�]} tj |d¦«}tt|¦«¦«dz }tj |d¦«}t#|¦« ¦«} n3#t&t(t*f$r} t-| ¦«Yd } ~ Œ°d } ~ wwxYwtj|dz¦«}t d„|D¦«¦«}d } d } |D�] }tj ||dz¦«}t#|d¬ ¦« ¦«}|dkr3ttj ||dz¦«d ¬ ¦«} n8|dkr2ttj ||dz¦«d ¬ ¦«} | �& t| ¦«dz } n#t*$rd } YnwxYw| �' t| ¦«dz } Œø#t*$rd } Y�ŒwxYw�Œ ||   d|| | f¦«�Œt/|¦«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*_*cóD—g|]}| d¦«d‘ŒS©rr©r™râs rEräz(sensors_temperatures..0ó&€Ð?Ð?Ð?°˜AŸGšG C™LœL¨œOÐ?Ð?Ð?rDz5/sys/devices/platform/coretemp.*/hwmon/hwmon*/temp*_*z'/sys/devices/platform/coretemp.*/hwmon/z/sys/class/hwmon/Ú_inputg@�@r«Ú_maxNrPÚ_critÚ_labelr±z /sys/class/thermal/thermal_zone*ÚtempÚtypez /trip_point*có¨—g|]O}d tj |¦« d¦«dd…¦«‘ŒPS)rrr%)rr—rtrr™)rãÚps rEräz(sensors_temperatures..psf€ðJðJðJØ9:ð #ŸxšxÝ”× Ò  Ñ#Ô#×)Ò)¨#Ñ.Ô.¨q°¨sÔ3ñ 5ô 5ðJðJðJrDÚ_typeÚcriticalÚ_tempÚhigh)Ú collectionsrr€r4ÚextendÚsortedr3r*r+Úsubr½rrr—rtrr rrírìrÕr(rÚdict)rÛÚ basenamesÚ basenames2Úreplr«ÚaltnameÚbasertrÚÚ unit_namerMrKÚlabelröÚ trip_pathsÚ trip_pointsÚ trip_pointÚ trip_types rEÚsensors_temperaturesr^s€õ Ô !¥$Ñ 'Ô '€CÝ” Ð;Ñ<Ô<€Ið×Ò•T”YÐGÑHÔHÑIÔIÐIÝ•sÐ?Ð?°YÐ?Ñ?Ô?Ñ@Ô@ÑAÔA€Iõ ”Ø?ñAôA€Jå Œ:Ð?Ñ @Ô @€DØð#ð#ˆØ—(’(Ð.°Ñ5Ô5ˆØ ˜)Ð #Ð #Ø × Ò ˜TÑ "Ô "Ð "øàð @ñ @ˆð ؘ(‘?ˆDÝ�D ™JœJÑ'Ô'¨&Ñ0ˆGÝ”7—<’<¥¤§¢°Ñ 5Ô 5°vÑ>Ô>ˆDݘD™ œ ŸšÑ)Ô)ˆIˆIøÝ�¥*Ð-ð ð ð ð ˆHð øøøõ�D˜6‘M¨DÐ1Ñ1Ô1ˆÝ˜˜w™°Ð6Ñ6Ô6ˆÝ�D˜8‘O¨bÐ1Ñ1Ô1×7Ò7Ñ9Ô9ˆà Ð ð ݘT‘{”{ VÑ+��øÝð ð ð Ø���ð øøøà Ð ð Ý  ™?œ?¨VÑ3��øÝð ð ð Ø���ð øøøð ˆIŒ×Ò˜u g¨t°XÐ>Ñ?Ô?Ð?Ñ?ð ñ(AÝ”IÐ@ÑAÔAˆ Ý�3˜y™>œ>Ñ*Ô*ˆ àð$ Añ$ AˆDð Ý”w—|’| D¨&Ñ1Ô1�Ý¥ T¡ ¤ Ñ+Ô+¨fÑ4�Ý”w—|’| D¨&Ñ1Ô1�Ý ™IœIŸOšOÑ-Ô-� � øÝ�W¥jÐ1ð ð ð Ý�c‘ ” � Ø����øøøøð øøøõœ 4¨.Ñ#8Ñ9Ô9ˆJÝðJðJØ>HðJñJôJñKôKˆKàˆH؈DØ)ð (ñ (� Ý”w—|’| D¨*°wÑ*>Ñ?Ô?�Ý ¨rÐ2Ñ2Ô2×8Ò8Ñ:Ô:� Ø  Ò*Ð*Ý#¥B¤G§L¢L°°zÀGÑ7KÑ$LÔ$LØ-1ð 3ñ 3ô 3�H�Hà &Ò(Ð(Ý¥¤§ ¢ ¨T°:ÀÑ3GÑ HÔ HØ)-ð/ñ/ô/�DðÐ#ð$Ý$ T™{œ{¨VÑ3˜˜øÝ%ð$ð$ð$Ø#˜˜˜ð$øøøàÐ'ð(Ý#(¨¡?¤?°VÑ#;˜˜øÝ%ð(ð(ð(Ø#'˜˜™ð(øøøñ(ð � ŒN× !Ò ! 2 w°°hÐ"?Ñ @Ô @Ð @Ñ @å �‰9Œ9ÐstÃBE Å E:Å9E:ÇG!Ç! G0Ç/G0Ç6H È HÈHÉ5BK6Ë6L&Ì L!Ì!L&ÐP/Ð/ P>Ð=P>ÑQÑ Q'Ñ&Q'cóü—tjt¦«}tjd¦«}|stjd¦«}t t d„|D¦«¦«¦«}|D�]} t t|dz¦«¦«}n-#ttf$r}t|¦«Yd}~ŒId}~wwxYwttj  tj  |¦«d¦«¦« ¦«}t|dzd¬ ¦« ¦«}|| t%j||¦«¦«�Œt)|¦«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*_*cóD—g|]}| d¦«d‘ŒSr?r@râs rEräz sensors_fans..ŸrArDrBNr«rEr±rP)rNrr€r4rPr3rîrrìrÕrrr—rtrr rír½rÚsfanrR)rÛrSrWrÚrörXrYs rEÚ sensors_fansrbŽsZ€õ Ô !¥$Ñ 'Ô '€CÝ” Ð:Ñ;Ô;€IØ ðGõ”IÐEÑFÔFˆ å•sÐ?Ð?°YÐ?Ñ?Ô?Ñ@Ô@ÑAÔA€IØð<ñ<ˆð Ý�$˜t h™Ñ/Ô/Ñ0Ô0ˆGˆGøÝ�Ð!ð ð ð Ý �#‰JŒJˆJØ ˆHˆHˆHˆHøøøøð øøøõ�œŸ š ¥R¤W§_¢_°TÑ%:Ô%:¸FÑCÔCÑDÔD×JÒJÑLÔLˆ Ý�D˜8‘O¨bÐ1Ñ1Ô1×7Ò7Ñ9Ô9ˆØ ˆIŒ×Ò�gœl¨5°'Ñ:Ô:Ñ;Ô;Ð;Ñ;å �‰9Œ9ÐsÁ0BÂB:Â!B5Â5B:cóh‡ —t¦«Š ˆ fd„}d„tjt¦«D¦«}|sdStj tt |¦«d¦«}||dz|dz¦«}||dz|dz¦«}||d z|d z¦«}||d z¦«}|�|� d |z|z }n;#t$rd }Yn-wxYwtt|dzd¬¦«¦«}|dkrdSd}|tj td¦«tj td¦«¦«} | �| dk}nGt|dzd¬¦«  ¦«  ¦«} | dkrd}n| dvrd}|r tj } nj|�5|�3 t||z dz¦«} nO#t$rtj} Yn7wxYw|�%t|dz¦«} | dkr tj} n tj} tj|| |¦«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ó°•—|D]Q}t|‰¬¦«}|‰kr8 t|¦«cS#t$r| ¦«cYcSwxYwŒRdS)zvAttempt to read the content of multiple files which may not exist. If none of them exist return None. rPN)rrîr(rí)rYrtrÛÚnulls €rEÚ multi_bcatz#sensors_battery..multi_bcat¶s„ø€ðð 'ð 'ˆDÝ�t dÐ+Ñ+Ô+ˆCØ�dŠ{ˆ{ð'ݘs™8œ8�O�O�OøÝ!ð'ð'ð'ØŸ9š9™;œ;Ð&Ð&Ð&Ð&Ð&ð'øøøðð ˆtsž/¯AÁAcóh—g|]/}| d¦«sd| ¦«v¯-|‘Œ0S)ÚBATÚbattery)ràr)râs rEräz#sensors_battery..ÃsG€ð $ð $ð $�!¸¿ º ÀUÑ8KÔ8Kð $Ø ˜Ÿš™œÐ "Ð "ð Ø "Ð "Ð "rDNrz /energy_nowz /charge_nowz /power_nowz /current_nowz /energy_fullz /charge_fullz/time_to_empty_nowgY@rÅz /capacityrrPz AC0/onlinez AC/onlinerú/statusr±Ú dischargingF)ÚchargingÚfullTié<)Úobjectr—r�ÚPOWER_SUPPLY_PATHrtrrPÚZeroDivisionErrorrîrrír)rÚPOWER_TIME_UNLIMITEDÚPOWER_TIME_UNKNOWNÚsbattery) rfÚbatsrÚ energy_nowÚ power_nowÚ energy_fullÚ time_to_emptyr`Ú power_pluggedÚonliner­Úsecsleftres @rEÚsensors_batteryr}­sÄø€õ ‰8Œ8€Dð ð ð ð ð ð $ð $•r”zÕ"3Ñ4Ô4ð $ñ $ô $€Dà ð؈tõ Œ7�<Š<Õ)­6°$©<¬<¸¬?Ñ ;Ô ;€Dð�Ø ˆ}ÑØ ˆ}Ññô€Jð� Ø ˆ|ÑØ ˆ~Ññô€Ið�*Ø ˆ~ÑØ ˆ~Ññô€Kð�J˜tÐ&:Ñ:Ñ;Ô;€MðР:Ð#9ð Ø˜jÑ(¨;Ñ6ˆGˆGøÝ ð ð ð ØˆGˆGˆGð øøøõ•c˜$ Ñ,°rÐ:Ñ:Ô:Ñ;Ô;ˆØ �bŠ=ˆ=Ø�4ð €MØ ˆZÝ Œ� Š Õ&¨ Ñ5Ô5Ý Œ� Š Õ&¨ Ñ4Ô4ñ6ô6€FðÐØ !š ˆ ˆ å�T˜IÑ%°Ð3Ñ3Ô3×9Ò9Ñ;Ô;×AÒAÑCÔCˆØ �]Ò "Ð "Ø!ˆMˆMØ Ð+Ð +Ð +Ø ˆMð ð .ÝÔ/ˆˆØ Ð  IÐ$9ð 2ݘ:¨ Ñ1°DÑ8Ñ9Ô9ˆHˆHøÝ ð 2ð 2ð 2ÝÔ1ˆHˆHˆHð 2øøøà Ð "Ý�} rÑ)Ñ*Ô*ˆØ �aŠ<ˆ<ÝÔ1ˆHøåÔ-ˆå Ô ˜G X¨}Ñ =Ô =Ð=s$Â=Cà CÃCÆ9GÇG(Ç'G(có¼—g}tj¦«}|D]C}|\}}}}}}|sŒ|dvrd}tj||pd|||¦«} | | ¦«ŒD|S)z:Return currently connected users as a list of namedtuples.)z:0.0z:0Ú localhostN)rÚusersrÚsuserr½) r4ÚrawlistÚitemr�ÚttyÚhostnameÚtstampÚ user_processr×Únts rEr€r€s…€à€GÝŒj‰lŒl€GØð ð ˆØ9=Ñ6ˆˆc�8˜V \°3ðð Ø Ø �~Ð %Ð %Ø"ˆHÝ Œ]˜4  ¨¨h¸ÀÑ DÔ DˆØ�Š�rÑÔÐÐØ €NrDcóL—dt¦«z}t|¦«5}|D]b}| d¦«rKt| ¦« ¦«d¦«}|a|ccddd¦«SŒctd|z¦«‚#1swxYwYdS)zAReturn the system boot time expressed in seconds since the epoch.r¯sbtimerNzline 'btime' not found in %s)rrràrrír™Ú BOOT_TIMEr¤)rtr¿rørÛs rEÚ boot_timer‹ sù€ð •Ñ(Ô(Ñ (€DÝ �TÑ Ô ð3˜aØð ð ˆDØ�Š˜xÑ(Ô(ð ݘDŸJšJ™LœL×.Ò.Ñ0Ô0°Ô3Ñ4Ô4�Ø� Ø� � ð 3ð3ð3ð3ñ3ô3ð3ð3ð õØ *¨TÑ 1ñ3ô3ð 3ð 3ð3ð3ð3øøøð3ð3ð3ð3ð3ð3s¡ABÂBÂB Bcóp—d„tjtt¦«¦«¦«D¦«S)z7Returns a list of PIDs currently running on the system.cóT—g|]%}| ¦«¯t|¦«‘Œ&SrC)rrîrâs rEräzpids..5s+€Ð LÐ LÐ L�qÀÇ Â Á Ä Ð L�C�‰FŒFÐ LÐ LÐ LrD)r—r�r#rrCrDrErŠrŠ3s.€à LÐ L�BœJ¥q­Ñ):Ô):Ñ';Ô';Ñ<Ô<Ð LÑ LÔ LÐLrDcó®—tj|¦«sdS t¦«›d|›d�}t|¦«5}|D]R}| d¦«r;t | ¦«d¦«}||kccddd¦«SŒStd|z¦«‚#1swxYwYdS#ttf$r|t¦«vcYSwxYw)zcCheck for the existence of a unix PID. Linux TIDs are not supported (always return False). Fr§rjsTgid:rNz'Tgid' line not found in %s) rÚ pid_existsrrràrîr™r(ÚEnvironmentErrorrŠ)r×rtr¿røÚtgids rEr�r�8s[€õ Ô ˜sÑ #Ô #ð!؈uð !õ&5Ñ%6Ô%6Ð%6Ð%6¸¸¸Ð<ˆDݘTÑ"Ô"ð G aØð+ð+�DØ—’ xÑ0Ô0ð+Ý" 4§:¢:¡<¤<°¤?Ñ3Ô3˜ð $ sš{Ð*Ð*ð  Gð Gð Gð Gñ Gô Gð Gð Gð+õ !Ð!>ÀÑ!EÑFÔFÐFð Gð Gð Gð Gøøøð Gð Gð Gð Gð Gð Gøõ!¥*Ð-ð !ð !ð !Ø�$™&œ&�=Ð Ð Ð ð !øøøs;˜#B0»AB# B0ÂB#Â#B'Â'B0Â*B'Â+B0Â0!CÃCcó–—i}t¦«}t¦«D]©} t|›d|›d�¦«5}| ¦«}ddd¦«n #1swxYwY| d¦«}||dzd… ¦«}t |d¦«}|||<Œ“#ttf$rYŒ¦wxYw|S)zsObtain a {pid: ppid, ...} dict for all running processes in one shot. Used to speed up Process.children(). r§ú/statNó)r=r) rrŠrr6rÇr™rîr r")rÛr¾r×r¿r"ÚrparÚdsetÚppids rEÚppid_mapr˜Xs!€ð €CÝ!Ñ#Ô#€K݉vŒvð ð ˆð ݨ[¨[¨[¸#¸#¸#Ð>Ñ?Ô?ð À1Ø—v’v‘x”x�ð ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð—:’:˜dÑ#Ô#ˆDؘ˜q™˜ ˜ ”?×(Ò(Ñ*Ô*ˆDÝ�t˜A”w‘<”<ˆD؈C�‰HˆHøõ"Õ#5Ð6ð ð ð ð ˆDð øøøð €Js4¢B2·AÁ B2ÁA ÁB2ÁA Á B2Â2CÃCcóF‡—tj‰¦«ˆfd„¦«}|S)zlDecorator which translates bare OSError and IOError exceptions into NoSuchProcess and AccessDenied. cóX•— ‰|g|¢Ri|¤ŽS#t$rt|j|j¦«‚t$rt |j|j¦«‚t $rJtj  |j ›d|j›�¦«st |j|j¦«‚‚wxYwr) r!rr×Ú_namer"rr r—rtr£ry)rzrëÚkwargsÚfuns €rEÚwrapperz wrap_exceptions..wrapperrsÐø€ð Ø�3�tÐ-˜dÐ-Ð-Ð- fÐ-Ð-Ð -øÝð 5ð 5ð 5ݘtœx¨¬Ñ4Ô4Ð 4Ý!ð 6ð 6ð 6Ý ¤¨$¬*Ñ5Ô5Ð 5Ý ð ð ð Ý”7—>’>¨TÔ->Ð->Ð->ÀÄÀÐ"IÑJÔJð :Ý# D¤H¨d¬jÑ9Ô9Ð9ð ð  øøøs ƒ �BB))Ú functoolsÚwraps)r�ržs` rEÚwrap_exceptionsr¡ns:ø€õ„_�SÑÔð ð ð ð ñÔð ð €NrDcóÔ—eZdZdZgd¢Zd„Zd„Zeed„¦«¦«Z eed„¦«¦«Z eed„¦«¦«Z d„Z d „Z ed „¦«Zd „Zed „¦«Zed „¦«Zed„¦«Zej dej¦«z¦«r ed„¦«Zed„¦«Zed„¦«Zed7d„¦«Zed„¦«Zed„¦«ZeserHed„¦«Zee j!d¦«e j!d¦«e j!d¦«fd„¦«Z"d„Z#neZ#er ed„¦«Z$ed„¦«Z%ee j!d¦«fd „¦«Z&ee j!d!¦«fd"„¦«Z'ed#„¦«Z(ed$„¦«Z)ed%„¦«Z*e+r)ed&„¦«Z,e j!d'¦«fd(„Z-ed)„¦«Z.e/red*„¦«Z0ed+„¦«Z1e2� ed7d,„¦«Z3ed-„¦«Z4ed.„¦«Z5ed8d0„¦«Z6ed1„¦«Z7ed2„¦«Z8ee j!d3¦«fd4„¦«Z9ee j!d5¦«fd6„¦«Z:dS)9ÚProcesszLinux process implementation.)r×r›Ú_ppidryÚ_cachecóV—||_d|_d|_t¦«|_dSr‰)r×r›r¤rry)rzr×s rEr{zProcess.__init__ˆs+€ØˆŒØˆŒ ؈Œ Ý+Ñ-Ô-ˆÔÐÐrDcóL—tj|j›d|j›�¦«dS)z+Raise NSP if the process disappeared on us.r§N)r—rryrשrzs rEÚ _assert_alivezProcess._assert_aliveŽs,€õ Œ˜4Ô,Ð,Ð,¨d¬h¨hÐ7Ñ8Ô8Ð8Ð8Ð8rDcóÖ—t|j›d|j›d�¦«}| d¦«}|| d¦«dz|…}||dzd… ¦«}i}||d<|d |d <|d|d <|d |d <|d|d<|d|d<|d|d<|d|d<|d|d<|d|d<|d|d<|S)aYParse /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 subtract 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. r§r“r”ó(rr=Nr«rr­r—r&Úttynré Úutimeé Ústimeé Úchildren_utimeröÚchildren_stimeéÚ create_timeé$Úcpu_numé'Ú blkio_ticks)rryr×rÇr%r™)rzr"r•r«rÁrÛs rEÚ_parse_stat_filezProcess._parse_stat_file”s€õ DÔ$5Ð$5Ð$5°t´x°x°xÐ@ÑAÔAˆð�zŠz˜$ÑÔˆØ�D—I’I˜d‘O”O aÑ'¨Ð,Ô-ˆØ�d˜Q‘h�i�i”×&Ò&Ñ(Ô(ˆàˆØˆˆF‰ ؘqœ ˆˆH‰ ؘQ”iˆˆF‰ ؘa”yˆˆG‰ ؘb”zˆˆG‰ ؘb”zˆˆG‰ Ø & r¤ ˆÐ ÑØ & r¤ ˆÐ ÑØ# BœZˆˆMÑØ œˆˆI‰Ø# BœZˆˆMÑàˆ rDcóœ—t|j›d|j›d�¦«5}| ¦«cddd¦«S#1swxYwYdS)z�Read /proc/{pid}/stat file and return its content. The return value is cached in case oneshot() ctx manager is in use. r§rjN)rryr×r6©rzr¿s rEÚ_read_status_filezProcess._read_status_file¶s’€õ¨4Ô+<Ð+<Ð+<¸d¼h¸h¸hÐGÑ HÔ Hð ÈAØ—6’6‘8”8ð ð ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð ð s AÁAÁAcóÀ—t|j›d|j›d�¦«5}| ¦« ¦«cddd¦«S#1swxYwYdS)Nr§z/smaps)rryr×r6rír¼s rEÚ_read_smaps_filezProcess._read_smaps_fileÀsœ€õ¨$Ô*;Ð*;Ð*;¸T¼X¸X¸XÐFÑ GÔ Gð $È1Ø—6’6‘8”8—>’>Ñ#Ô#ð $ð $ð $ð $ñ $ô $ð $ð $ð $ð $ð $ð $øøøð $ð $ð $ð $ð $ð $s &AÁAÁAcó¢—|j |¦«|j |¦«|j |¦«dSr‰)rºÚcache_activater½r¿r¨s rEÚ oneshot_enterzProcess.oneshot_enterÆsM€Ø Ô×,Ò,¨TÑ2Ô2Ð2Ø Ô×-Ò-¨dÑ3Ô3Ð3Ø Ô×,Ò,¨TÑ2Ô2Ð2Ð2Ð2rDcó¢—|j |¦«|j |¦«|j |¦«dSr‰)rºÚcache_deactivater½r¿r¨s rEÚ oneshot_exitzProcess.oneshot_exitËsM€Ø Ô×.Ò.¨tÑ4Ô4Ð4Ø Ô×/Ò/°Ñ5Ô5Ð5Ø Ô×.Ò.¨tÑ4Ô4Ð4Ð4Ð4rDcóf—| ¦«d}trt|¦«}|S)Nr«)rºrr)rzr«s rEr«z Process.nameÐs0€à×$Ò$Ñ&Ô& vÔ.ˆÝ ð ݘ$‘<”<ˆDàˆ rDcó°— t|j›d|j›d�¦«S#ttf$r€t j |j›d|j›�¦«rYdSt|j¦«st|j|j ¦«‚t|j|j |j ¦«‚t$rt|j|j ¦«‚wxYw)Nr§z/exer±)r˜ryr×r r"r—rtÚlexistsr�rr›rr¤r!rr¨s rEÚexez Process.exeØsä€ð 5ݨ4Ô+<Ð+<Ð+<¸d¼h¸h¸hÐGÑHÔHÐ HøÝ!Õ#5Ð6ð Jð Jð JõŒw�Ѝ$Ô*;Ð*;Ð*;¸T¼X¸XÐFÑGÔGð JØ�r�rå! $¤(Ñ+Ô+ðJÝ'¨¬°$´*Ñ=Ô=Ð=å'¨¬°$´*¸d¼jÑIÔIÐIÝð 5ð 5ð 5ݘtœx¨¬Ñ4Ô4Ð 4ð 5øøøs‚!¡?CÁ#A2Ccó¢—t|j›d|j›d�¦«5}| ¦«}ddd¦«n #1swxYwY|sgS| d¦«rdnd}| |¦«r |dd…}| |¦«}|dkr,t |¦«dkrd|vr| d¦«}|S)Nr§z/cmdliner“rˆrr)rryr×r6ršr™r¼)rzr¿r"ÚsepÚcmdlines rErÌzProcess.cmdlineés€å ¨$Ô*;Ð*;Ð*;¸T¼X¸X¸XÐFÑ GÔ Gð È1Ø—6’6‘8”8ˆDð ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð àð àˆI🠚  fÑ-Ô-Ð6ˆfˆf°3ˆØ �=Š=˜Ñ Ô ð Ø˜˜˜”9ˆDØ—*’*˜S‘/”/ˆð �&Š=ˆ=�S ™\œ\¨QÒ.Ð.°3¸$°;°;Ø—j’j ‘o”oˆG؈ó AÁAÁAcó¶—t|j›d|j›d�¦«5}| ¦«}ddd¦«n #1swxYwYt |¦«S)Nr§z/environ)rryr×r6r)rzr¿r"s rEÚenvironzProcess.environs‘€å ¨$Ô*;Ð*;Ð*;¸T¼X¸X¸XÐFÑ GÔ Gð È1Ø—6’6‘8”8ˆDð ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð å" 4Ñ(Ô(Ð(rÍcóª—t| ¦«d¦«}tj¦«} ||S#t$rYdSwxYw)Nr¬)rîrºrÚget_terminal_maprê)rzÚtty_nrrxs rEÚterminalzProcess.terminals_€å�T×*Ò*Ñ,Ô,¨WÔ5Ñ6Ô6ˆÝÔ(Ñ*Ô*ˆð ؘ”<Ð øÝð ð ð Ø�4�4ð øøøs¼AÁ AÁAz /proc/%s/ioc ó*—|j›d|j›d�}i}t|¦«5}|D]T}| ¦«}|r< | d¦«\}}t |¦«||<ŒD#t $rYŒPwxYwŒU ddd¦«n #1swxYwY|std|z¦«‚ t|d|d|d|d|d |d ¦«S#t$r'}t |j d ›d |›d |›�¦«‚d}~wwxYw)Nr§z/ios: z%s file was emptyssyscrssyscws read_bytess write_bytessrcharswcharrz field was not found in z; found fields are ) ryr×rrír™rîr(r¤r‰rêrë)rzÚfnamerÁr¿rør«r?rös rEÚ io_counterszProcess.io_counterss»€à"&Ô"3Ð"3Ð"3°T´X°X°XÐ>ˆE؈FݘUÑ#Ô#ð 6 qØð 6ð 6�DàŸ:š:™<œ<�DØð6ð6Ø*.¯*ª*°UÑ*;Ô*;™K˜D %õ ,/¨u©:¬:˜F 4™L˜Løõ *ð%ð%ð%à$˜Hð%øøøð6ð 6ð 6ð 6ð 6ñ 6ô 6ð 6ð 6ð 6ð 6ð 6ð 6øøøð 6ð 6ð 6ð 6ðð @Ý"Ð#6¸Ñ#>Ñ?Ô?Ð?ð JÝØ˜8Ô$ؘ8Ô$ؘ=Ô)ؘ>Ô*ؘ8Ô$ؘ8Ô$ñ ôðøõð Jð Jð JÝ Ø-0¬X°a¬[¨[¨[¸%¸%¸%ÀÀð"IñJôJðJøøøøð JøøøsM¤B ÁA+ÁB Á+ A8Á5B Á7A8Á8B  B ÂB Â)7C!Ã! DÃ+"D Ä Dcór—| ¦«}t|d¦«tz }t|d¦«tz }t|d¦«tz }t|d¦«tz }t|d¦«tz }t|||||¦«S)Nr®r°r²r³r¹)rºrrrŒ)rzrÀr®r°r²r³r‘s rErzProcess.cpu_times2sœ€à×&Ò&Ñ(Ô(ˆÝ�f˜W”oÑ&Ô&­Ñ4ˆÝ�f˜W”oÑ&Ô&­Ñ4ˆÝ˜vÐ&6Ô7Ñ8Ô8½;ÑFˆÝ˜vÐ&6Ô7Ñ8Ô8½;ÑFˆÝ�v˜mÔ,Ñ-Ô-µ Ñ;ˆÝ˜  ~°~ÀvÑNÔNÐNrDcóP—t| ¦«d¦«S)zWhat CPU the process is on.r·©rîrºr¨s rEr·zProcess.cpu_num<s#€õ�4×(Ò(Ñ*Ô*¨9Ô5Ñ6Ô6Ð6rDNcóB—tj|j||j¦«Sr‰)rÚwait_pidr×r›)rzÚtimeouts rEÚwaitz Process.waitAs€åÔ  ¤¨7°D´JÑ?Ô?Ð?rDcó”—t| ¦«d¦«}tp t¦«}|tz |zS)Nrµ)rrºrŠr‹r)rzÚctimeÚbts rErµzProcess.create_timeEs@€å�d×+Ò+Ñ-Ô-¨mÔ<Ñ=Ô=ˆõ Ð %�)™+œ+ˆØ� Ñ# rÑ)Ð)rDc ó—t|j›d|j›d�¦«5}d„| ¦« ¦«dd…D¦«\}}}}}}}ddd¦«n #1swxYwYt |||||||¦«S)Nr§z/statmcó<—g|]}t|¦«tz‘ŒSrC)rîrïrâs rEräz'Process.memory_info.._s#€ÐEÐEÐE q•�Q‘”�(Ñ"ÐEÐEÐErDr°)rryr×r»r™ry) rzr¿ÚvmsrrgÚtextÚlibr"Údirtys rEÚ memory_infozProcess.memory_infoPså€õ¨$Ô*;Ð*;Ð*;¸T¼X¸X¸XÐFÑ GÔ Gð FÈ1àEÐE¨A¯JªJ©L¬L×,>Ò,>Ñ,@Ô,@ÀÀ!ÀÔ,DÐEÑEÔEñ 5ˆC��f˜d C¨¨uð Fð Fð Fñ Fô Fð Fð Fð Fð Fð Fð Føøøð Fð Fð Fð Fõ�C˜˜f d¨C°°uÑ=Ô=Ð=s AA-Á-A1Á4A1cóî—dx}x}} td |j|j¦«¦«5}|D]Ä}| d¦«r.|t | ¦«d¦«dzz }ŒE| d¦«r+t | ¦«d¦«dz}Œ…| d¦«r*t | ¦«d¦«dz}ŒÅ ddd¦«n #1swxYwYn\#t$rOt|j¦«st|j|j ¦«‚t|j|j |j ¦«‚wxYw|||fS)Nrz{}/{}/smaps_rollupsPrivate_rrþóPss:óSwap:) rÚformatryr×ràrîr™r"r�rr›rr¤)rzr{r|r}r¿røs rEÚ_parse_smaps_rollupzProcess._parse_smaps_rollupds½€ð !Ð ˆCÐ �#˜ð JÝ Ð!5×!<Ò!<ØÔ)¨4¬8ñ"5ô"5ñ6ô6ð ?Ø9:Ø !ð?ð?˜ØŸ?š?¨;Ñ7Ô7ð?à¥3 t§z¢z¡|¤|°A¤Ñ#7Ô#7¸$Ñ#>Ñ>˜C˜CØ!Ÿ_š_¨WÑ5Ô5ð?Ý"% d§j¢j¡l¤l°1¤oÑ"6Ô"6¸Ñ"=˜C˜CØ!Ÿ_š_¨XÑ6Ô6ð?Ý#& t§z¢z¡|¤|°A¤Ñ#7Ô#7¸$Ñ#>˜Døð?ð ?ð ?ð ?ñ ?ô ?ð ?ð ?ð ?ð ?ð ?ð ?øøøð ?ð ?ð ?ð ?øøõ&ð Jð Jð JÝ! $¤(Ñ+Ô+ðJÝ'¨¬°$´*Ñ=Ô=Ð=å'¨¬°$´*¸d¼jÑIÔIÐIð  Jøøøð ˜˜dÐ#Ð #s0ˆ-DµCD Ã> DÄ DÄDÄDÄDÄAE/s\nPrivate.*:\s+(\d+)s\nPss\:\s+(\d+)s\nSwap\:\s+(\d+)có„—| ¦«}ttt| |¦«¦«¦«dz}ttt| |¦«¦«¦«dz}ttt| |¦«¦«¦«dz}|||fS)Nrþ)r¿r7rÈrîÚfindall)rzÚ _private_reÚ_pss_reÚ_swap_reÚ smaps_datar{r|r}s rEÚ _parse_smapszProcess._parse_smaps|s €ð,×.Ò.Ñ0Ô0ˆJõ•c�#˜{×2Ò2°:Ñ>Ô>Ñ?Ô?Ñ@Ô@À4ÑGˆCÝ•c�#˜wŸš¨zÑ:Ô:Ñ;Ô;Ñ<Ô<¸tÑCˆCÝ•s�3 × 0Ò 0°Ñ <Ô <Ñ=Ô=Ñ>Ô>ÀÑEˆDؘ˜dÐ#Ð #rDcó¸—tr| ¦«\}}}n| ¦«\}}}| ¦«}t ||||fzŽSr‰)ÚHAS_PROC_SMAPS_ROLLUPrìrórçrz)rzr{r|r}Ú basic_mems rEÚmemory_full_infozProcess.memory_full_infošsb€Ý$ð 5Ø!%×!9Ò!9Ñ!;Ô!;‘��S˜$˜$à!%×!2Ò!2Ñ!4Ô!4‘��S˜$Ø×(Ò(Ñ*Ô*ˆIݘY¨#¨s°DÐ)9Ñ9Ð:Ð :rDcó—d„}| ¦«}|sgS| d¦«}g}| d¦«}|g}|||¦«D�]¥\}}| dd¦«} |\} } } } } }n#t$r|dgz\} } } } } }YnwxYw|sd}nXtrt |¦«}| ¦«}| d¦«rt|¦«s |dd …}|  t | ¦«t | ¦«||  d d¦«|  d d¦«|  d d¦«|  d d¦«|  dd¦«|  dd¦«|  dd¦«|  dd¦«|  dd¦«|  dd¦«f ¦«�Œ§|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. c3óÄK—i}|D]À}| dd¦«}|d d¦«s.| ¦«|fV—| |¦«Œa t |d¦«dz||d<Œ„#t $r0|d d¦«rYŒ«t d|z¦«‚wxYw| ¦«|fV—dS)NérrIrrþsVmFlags:z#don't know how to interpret line %r)r™ršÚpopr½rîr(rà)rÉÚ current_blockr"rørÁs rEÚ get_blocksz'Process.memory_maps..get_blocks°s*èè€Ø�Ø!ðIðI�DØ!ŸZšZ¨¨aÑ0Ô0�FØ! !œ9×-Ò-¨dÑ3Ô3ð Ià,×0Ò0Ñ2Ô2°DÐ9Ð9Ð9Ð9Ø%×,Ò,¨TÑ2Ô2Ð2Ð2ðIÝ.1°&¸´)©n¬n¸tÑ.C˜D ¨¤™O˜OøÝ)ðIðIðIØ% aœy×3Ò3°KÑ@Ô@ðIà ( å&0ð2AØCGñ2Hñ'Iô'Ið!Ið Iøøøð%×(Ò(Ñ*Ô*¨DÐ1Ð1Ð1Ð1Ð1Ð1sÁ)!B  %CÂ2Có rNrúr±z[anon]r”r•sRss:sSize:rés Shared_Clean:s Shared_Dirty:sPrivate_Clean:sPrivate_Dirty:s Referenced:s Anonymous:rê) r¿r™rûr(rrríršrr½ré)rzrýr"rÉr8Ú first_linerüÚheaderÚhfieldsr™ÚpermsÚoffsetrr†rts rEÚ memory_mapszProcess.memory_maps§s+€ð 2ð 2ð 2ð(×(Ò(Ñ*Ô*ˆDàð Ø� Ø—J’J˜uÑ%Ô%ˆE؈BØŸš 1™œˆJØ'˜LˆMØ *  ¨5°-Ñ @Ô @ð ñ ‘ �˜Ø Ÿ,š, t¨QÑ/Ô/�ð'ØÁ>BÂBcó— t|j›d|j›d�¦«S#ttf$rOt |j¦«st |j|j¦«‚t|j|j|j ¦«‚wxYw)Nr§z/cwd) r˜ryr×r r"r�rr›rr¤r¨s rEÚcwdz Process.cwdësŽ€ð Fݨ4Ô+<Ð+<Ð+<¸d¼h¸h¸hÐGÑHÔHÐ HøÝ!Õ#5Ð6ð Fð Fð Få˜dœhÑ'Ô'ð FÝ# D¤H¨d¬jÑ9Ô9Ð9å# D¤H¨d¬j¸$¼*ÑEÔEÐEð  Føøøs ‚!¡A Bsctxt_switches:\t(\d+)có—| ¦«}| |¦«}|s td|j›d|j›d�¦«‚t jt|d¦«t|d¦«¦«S)NzR'voluntary_ctxt_switches' and 'nonvoluntary_ctxt_switches'lines were not found in r§z1/status; the kernel is probably older than 2.6.23rr)r½rîrVryr×rÚpctxswrî)rzÚ _ctxsw_rer"Úctxsws rEÚnum_ctx_switcheszProcess.num_ctx_switchesös‰€ð×%Ò%Ñ'Ô'ˆØ×!Ò! $Ñ'Ô'ˆØð @Ý%Ð%ðÔ%Ð%Ð% t¤x x xð1ñ2ô2ð 2õ ”>¥# e¨A¤h¡-¤-µ°U¸1´X±´Ñ?Ô?Ð ?rDsThreads:\t(\d+)cóz—| ¦«}t| |¦«d¦«S©Nr)r½rîrî)rzÚ_num_threads_rer"s rEÚ num_threadszProcess.num_threadss6€ð ×%Ò%Ñ'Ô'ˆÝ�?×*Ò*¨4Ñ0Ô0°Ô3Ñ4Ô4Ð4rDcó—tj|j›d|j›d�¦«}| ¦«g}d}|D�]'}|j›d|j›d|›d�} t |¦«5}| ¦« ¦«}ddd¦«n #1swxYwYn#ttf$rd}YŒ|wxYw||  d¦«dzd…}|  d ¦«}t|d ¦«tz } t|d ¦«tz } tjt!|¦«| | ¦«} | | ¦«�Œ)|r| ¦«|S) Nr§z/taskFz/task/r“Tr”r=rr­r¯)r—r�ryr×rTrr6rír r"r%r™rrrÚpthreadrîr½r©) rzÚ thread_idsr4Ú hit_enoentÚ thread_idrÕr¿ÚstrÀr®r°r<s rEÚthreadszProcess.threads s€å”Z°Ô0AÐ0AÐ0AÀ4Ä8À8À8Ð LÑMÔMˆ Ø�ŠÑÔÐØˆØˆ Ø#ð #ñ #ˆIàÔ!Ð!Ð! 4¤8 8 8¨Y¨Y¨Yð8ˆEð Ý  Ñ'Ô'ð*¨1ØŸš™œŸšÑ)Ô)�Bð*ð*ð*ñ*ô*ð*ð*ð*ð*ð*ð*øøøð*ð*ð*ð*øøå%Õ'9Ð:ð ð ð ð"� Ø�ð  øøøð �B—G’G˜D‘M”M AÑ%Ð&Ð&Ô'ˆBØ—X’X˜d‘^”^ˆFݘ& œ*Ñ%Ô%­ Ñ3ˆEݘ& œ*Ñ%Ô%­ Ñ3ˆEÝ”_¥S¨¡^¤^°U¸EÑBÔBˆFØ �NŠN˜6Ñ "Ô "Ð "Ñ "Ø ð !Ø × Ò Ñ Ô Ð Øˆs6ÁB&Á''B B&ÂB ÂB&Â!B Â"B&Â&B<Â;B<có4—tj|j¦«Sr‰)räÚ getpriorityr×r¨s rEÚnice_getzProcess.nice_get(s€õÔ% d¤hÑ/Ô/Ð/rDcó6—tj|j|¦«Sr‰)räÚ setpriorityr×)rzr?s rEÚnice_setzProcess.nice_set1s€åÔ% d¤h°Ñ6Ô6Ð6rDcó4—tj|j¦«Sr‰)rr8r×r¨s rEÚcpu_affinity_getzProcess.cpu_affinity_get8s€åÔ-¨d¬hÑ7Ô7Ð 7rDsCpus_allowed_list:\t(\d+)-(\d+)c óf—| ¦«}| |¦«}|rRttt |dd¦«t |dd¦«dz¦«¦«Sttt t ¦«¦«¦«¦«S)Nrr)r½rîr€Úrangerîr¼r#)rzÚ_rer"r,s rEÚ_get_eligible_cpuszProcess._get_eligible_cpus<s�€ð×)Ò)Ñ+Ô+ˆDØ—K’K Ñ%Ô%ˆEØð 9Ý�E¥# e¨A¤h¨q¤kÑ"2Ô"2µC¸¸a¼À¼ Ñ4DÔ4DÀqÑ4HÑIÔIÑJÔJÐJå�E¥#¥m¡o¤oÑ"6Ô"6Ñ7Ô7Ñ8Ô8Ð8rDc óÄ— tj|j|¦«dS#ttf$r°}t |t¦«s|jt jkr€| ¦«}tttt¦«¦«¦«¦«}|D]4}||vrt d|›d|›�¦«‚||vrt d|›d|›�¦«‚Œ5‚d}~wwxYw)Nzinvalid CPU number z; choose between z CPU number z! is not eligible; choose between ) rÚproc_cpu_affinity_setr×rÕr(r–r‚rƒr"Útupler r¼r#)rzr!röÚ eligible_cpusÚall_cpusÚcpus rEÚcpu_affinity_setzProcess.cpu_affinity_setFs€ð ÝÔ*¨4¬8°TÑ:Ô:Ð:Ð:Ð:øÝ�ZÐ(ð ð ð ݘc¥:Ñ.Ô.ð E°#´)½u¼|Ò2KÐ2KØ$(×$;Ò$;Ñ$=Ô$=�MÝ$¥U­3­}©¬Ñ+?Ô+?Ñ%@Ô%@ÑAÔA�HØ#ðEðE˜Ø hÐ.Ð.Ý", *à$' C C¨¨ð!8ñ#9ô#9ð9ð mÐ3Ð3Ý", *à03°°°]°]ð!Dñ#Eô#EðEð4ðøøøøð øøøs‚žC¯B+CÃCcó�—tj|j¦«\}}t�t |¦«}t j||¦«Sr‰)rr7r×Úenumr?rÚpionice©rzÚioclassr?s rEÚ ionice_getzProcess.ionice_get\s=€å!Ô1°$´(Ñ;Ô;‰NˆG�UÝÐÝ$ WÑ-Ô-�Ý”? 7¨EÑ2Ô2Ð 2rDcó¾—|€d}|r"|ttfvrtd|z¦«‚|dks|dkrtd¦«‚tj|j||¦«S)Nrz%r ioclass accepts no valuer°zvalue not in 0-7 range)r+r(r(rÚproc_ioprio_setr×r-s rEÚ ionice_setzProcess.ionice_setcsq€àˆ}Ø�Øð J˜Õ%6Õ8IÐ$JÐJÐJÝ Ð!>ÀÑ!HÑIÔIÐIØ�qŠyˆy˜E AšI˜IÝ Ð!9Ñ:Ô:Ð:ÝÔ'¨¬°'¸5ÑAÔAÐ ArDcó²—|jdkrtd¦«‚ |€t|j|¦«St|¦«dkrtdt |¦«z¦«‚t|j||¦«dS#t $rO}|jt jkr4t|j¦«r t|j|j |j ¦«‚‚d}~wwxYw)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‚ÚENOSYSr�rr›r¤)rzrØrÙrös rEÚrlimitzProcess.rlimitosè€ð Œx˜1Š}ˆ}Ý Ð!LÑMÔMÐMð Ø�>å" 4¤8¨YÑ7Ô7Ð7õ˜6‘{”{ aÒ'Ð'Ý(ð%Ý'+¨F¡|¤|ñ4ñ5ô5ð5õ˜DœH i°Ñ8Ô8Ð8Ð8Ð8øÝð ð ð Ø”9¥¤ Ò,Ð,µ¸D¼HÑ1EÔ1EÐ,õ(¨¬°$´*¸d¼jÑIÔIÐIàøøøøð  øøøsœA=³AA=Á= CÂA CÃCcó¢—| ¦«d}tr| ¦«}t |d¦«S)Nr­ú?)rºrrÚ PROC_STATUSESré)rzÚletters rEr­zProcess.status‰sC€à×&Ò&Ñ(Ô(¨Ô2ˆÝ ð %Ø—]’]‘_”_ˆFå× Ò  ¨Ñ-Ô-Ð-rDcó6—g}tj|j›d|j›d�¦«}d}|D�]Ö}|j›d|j›d|›�} t |¦«}| d¦«�r,t |¦«�r|j›d|j›d|›�} t|¦«5}t|  ¦«  ¦«d¦«}t|  ¦«  ¦«dd¦«} ddd¦«n #1swxYwYt| ¦«} t|t|¦«t|¦«| | ¦«} |  | ¦«�ŒO#ttf$rd}Y�ŒewxYw�Œk#ttf$rd}Y�Œ�t $rK} | jt"jkrYd} ~ �Œ¥| jt"jkrt)| ¦«Yd} ~ �ŒÏ‚d} ~ wwxYw|r| ¦«|S) Nr§r}Fr~z/fdinfo/rr´T)r—r�ryr×r˜ràrrrîr»r™r¥rsr½r r"rÕr‚rƒr„rr©) rzr4r rrur§rtr¿Úposrxrwr<rös rEÚ open_fileszProcess.open_files‘s–€àˆÝ” ¨Ô):Ð):Ð):¸D¼H¸H¸HÐEÑFÔFˆØˆ Øð& /ñ& /ˆBØ$(Ô$5Ð$5Ð$5°t´x°x°xÀÀÐDˆDð$ /Ý ‘~”~�ð&—?’? 3Ñ'Ô'ñ/­M¸$Ñ,?Ô,?ñ/ðÔ)Ð)Ð)¨4¬8¨8¨8°R°Rð9�Dð /Ý(¨Ñ.Ô.ðD°!Ý"% a§j¢j¡l¤l×&8Ò&8Ñ&:Ô&:¸1Ô&=Ñ">Ô">˜CÝ$'¨¯ ª © ¬ ×(:Ò(:Ñ(<Ô(<¸QÔ(?ÀÑ$CÔ$C˜EðDðDðDñDôDðDðDðDðDðDðDøøøðDðDðDðDõ 2°%Ñ8Ô8˜Ý!*Ø ¥# b¡'¤'­3¨s©8¬8°T¸5ñ"Bô"B˜àŸš vÑ.Ô.Ð.Ñ.øõ.Õ/AÐBð*ð*ð*ð&*˜ ˜ ™ ð*øøøùøõ5&Õ'9Ð:ð ð ð à!� Ø‘Ýð ð ð Ø”9¥¤ Ò,Ð,à�H�H�H‘HØ”9¥Ô 2Ò2Ð2å˜#‘J”J�JØ�H�H�H‘HØøøøøð øøøð> ð !Ø × Ò Ñ Ô Ð ØˆsaÁF E:ÂA4DÄ E:ÄD Ä E:Ä#D Ä$E:Å:FÆFÆHÆ, HÆ5G;Ç$G;Ç:G;Ç;Hrocón—t ||j¦«}| ¦«|Sr‰)rÃr¿r×r©)rzr»rÛs rEÚ connectionszProcess.connectionsÁs0€å×#Ò# D¨$¬(Ñ3Ô3ˆØ ×ÒÑÔÐØˆ rDcód—ttj|j›d|j›d�¦«¦«S)Nr§r})r¼r—r�ryr×r¨s rEÚnum_fdszProcess.num_fdsÇs.€å•2”:¨DÔ,=Ð,=Ð,=¸t¼x¸x¸xÐHÑIÔIÑJÔJÐJrDcóP—t| ¦«d¦«S)Nr—rÙr¨s rEr—z Process.ppidËs!€å�4×(Ò(Ñ*Ô*¨6Ô2Ñ3Ô3Ð3rDsUid:\t(\d+)\t(\d+)\t(\d+)cóâ—| ¦«}| |¦«d\}}}tjt |¦«t |¦«t |¦«¦«Sr )r½rîrÚpuidsrî)rzÚ_uids_rer"ÚrealÚ effectiveÚsaveds rEÚuidsz Process.uidsÏóX€à×%Ò%Ñ'Ô'ˆØ!)×!1Ò!1°$Ñ!7Ô!7¸Ô!:шˆi˜ÝŒ}�S ™YœY­¨I©¬½¸E¹ ¼ ÑCÔCÐCrDsGid:\t(\d+)\t(\d+)\t(\d+)cóâ—| ¦«}| |¦«d\}}}tjt |¦«t |¦«t |¦«¦«Sr )r½rîrÚpgidsrî)rzÚ_gids_rer"rErFrGs rEÚgidsz Process.gidsÕrIrDr‰©ro);r@rArBrÀr&r{r©r¡rrºr½r¿rÂrÅr«rÉrÌrÏrÓr—rtr£ÚgetpidrÖrr·rÝrµrçrõÚHAS_PROC_SMAPSrìr*r+rór÷rrr rrrrÚHAS_CPU_AFFINITYrr"r)ÚHAS_PROC_IO_PRIORITYr/r2rÆr5r­r<r>r@r—rHrMrCrDrEr£r£ƒs}€€€€€Ø'Ð'àCÐCÐC€Ið.ð.ð.ð 9ð9ð9ð ØððñÔñ„_ðð@ØððñÔñ„_ððØð$ð$ñÔñ„_ð$ð3ð3ð3ð 5ð5ð5ð ððñ„_ðð5ð5ð5ð"ððñ„_ðð0ð)ð)ñ„_ð)ð ððñ„_ðð „w‡~‚~�m i b¤i¡k¤kÑ1Ñ2Ô2ðJØ ð Jð Jñ Œð Jð<ðOðOñ„_ðOðð7ð7ñ„_ð7ðð@ð@ð@ñ„_ð@ðð*ð*ñ„_ð*ðð>ð>ñ„_ð>ð"ðA' ðA'à ð $ð $ñ Œð $ð. ð'˜BœJÐ'?Ñ@Ô@Ø"˜œ Ð#6Ñ7Ô7Ø#˜œÐ$8Ñ9Ô9ð  $ð $ð $ñ Œð $ð: ;ð ;ð ;ð ;ð'ÐàðDà ðA ðA ñ ŒðA ðFðFðFñ„_ðFðà#- 2¤:Ð.GÑ#HÔ#Hð @ð @ð @ñ„_ð @ðØ*4¨"¬*Ð5HÑ*IÔ*Ið5ð5ð5ñ„_ð5ðððñ„_ðð6ð0ð0ñ„_ð0ðð7ð7ñ„_ð7ðð!à ð 8ð 8ñ Œð 8ð%˜"œ*Ð%HÑIÔIð 9ð 9ð 9ð 9ð ð ð ñ Œð ð&ðBà ð 3ð 3ñ Œð 3ð ð Bð Bñ Œð BðÐà ð ð ð ñ Œð ð2ð.ð.ñ„_ð.ðð-ð-ñ„_ð-ð^ðððñ„_ðð ðKðKñ„_ðKðð4ð4ñ„_ð4ðØ&˜BœJÐ'DÑEÔEðDðDðDñ„_ðDð Ø&˜BœJÐ'DÑEÔEðDðDðDñ„_ðDðDðDrDr£r‰rN)F)¦rÀÚ __future__rr”rNr‚rŸr4r—r*rrr–ÚsysÚ tracebackrrrr±rrr rr rär r r rrrrrrrrrrrrrrrrrÚ_compatrr r!r"r#r$Ú version_infor+Ú__extra__all__rprtr£rOrPrõÚhasattrrRrQr'rÚ getpagesizerïrŠÚ byteorderr’r Ú AF_PACKETr<ÚIntEnumrîr;r(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_PARKEDr8r,r-r.r/r0r1r2r3r4r5r6r¥r]rirsryrrzr~rr‡r‰rŒr˜r¥r­rÃÚ ExceptionÚ print_excrºrÆÚresourceÚ ImportErrorrÍÚCDLLrÒrOÚdirrûr rrr#r/r@rGrJr_Ú net_if_addrsrcrerÃrÄrÜrñÚ disk_usagerrr/r^rbr}r€r‹rŠr�r˜r¡ror£rCrDrEúrssŒ ðð %Ð$àÐÐÐÐÐà € € € ØÐÐÐØ € € € ØÐÐÐØ € € € Ø € € € Ø € € € Ø € € € Ø € € € Ø € € € ØÐÐÐØ€€€Ø#Ð#Ð#Ð#Ð#Ð#Ø"Ð"Ð"Ð"Ð"Ð"àÐÐÐÐÐØÐÐÐÐÐØ#Ð#Ð#Ð#Ð#Ð#Ø)Ð)Ð)Ð)Ð)Ð)Ø$Ð$Ð$Ð$Ð$Ð$Ø$Ð$Ð$Ð$Ð$Ð$Ø'Ð'Ð'Ð'Ð'Ð'Ø!Ð!Ð!Ð!Ð!Ð!Ø"Ð"Ð"Ð"Ð"Ð"Ø"Ð"Ð"Ð"Ð"Ð"ØÐÐÐÐÐØÐÐÐÐÐØÐÐÐÐÐØÐÐÐÐÐØ$Ð$Ð$Ð$Ð$Ð$Ø"Ð"Ð"Ð"Ð"Ð"ØÐÐÐÐÐØ+Ð+Ð+Ð+Ð+Ð+Ø Ð Ð Ð Ð Ð ØÐÐÐÐÐØ(Ð(Ð(Ð(Ð(Ð(Ø'Ð'Ð'Ð'Ð'Ð'Ø"Ð"Ð"Ð"Ð"Ð"Ø"Ð"Ð"Ð"Ð"Ð"ØÐÐÐÐÐØ&Ð&Ð&Ð&Ð&Ð&Ø$Ð$Ð$Ð$Ð$Ð$Ø'Ð'Ð'Ð'Ð'Ð'ØÐÐÐÐÐØÐÐÐÐÐðÔ�vÒÐØ€K€K€K€Kà €Dð 6ð 6ð 6€ð".ÐØ”—’Ð 0°9°2´9±;´;Ñ >Ñ?Ô?€ØœŸšÐ'>ÀÀÄÁÄÑ'LÑMÔMÐØ�w˜tÐ%6Ñ7Ô7ÐØ�7˜4Ð!8Ñ9Ô9ÐðˆbŒj˜Ñ&Ô&€ Ø !ˆ:Ô !Ñ #Ô #€Ø € Ø”  Ò)€ ðÐà€<ØÔ€G€Gà �D”L Ø"+¨S¨S°Ô1AÑ-BÔ-BÐ!CñEôE€MàÔ#€Gð€<ØÐØ€OØ€OØÐÐððððð�T”\ñôðð  €G�I„I×Ò�ZÔ+Ñ,Ô,Ð,ð Ô Ø Ô Ø Ô "Ø Ô Ø Ô $Ø Ô Ø Ô Ø Ô Ø Ô !Ø Ô Ø Ô Ø Ô ð ð € ð" Ô "Ø Ô Ø Ô Ø Ô Ø Ô Ø Ô Ø Ô Ø Ô !Ø Ô Ø Ô Ø Ô ð ð € ð* ˆ Ø ðKðKðKñ Lô L€ð ˆ*Ø ðððñ ô €ð ˆJØÐ<Ð<Ð<ñ >ô >€ ð€z�&Ð>Ñ?Ô?€à ˆ:�j $¤,Ð1GÑ"GÑ HÔ H€à� ØðJðJðJñKôK€ ð ˆJØ� §¢¨-Ô*?Ñ!@Ô!@Ñ@ñ Bô B€ ð€j�ð6ð6ð6ñ7ô7€ð ˆJ�{ð"ð"ð"ñ #ô #€ ðððð( ð ð ð$ð$ð$ð& ð0ð0ñ „ð0ð0KØÐ˜Ñ!Ô!Ð!Ð!øØðKðKðKà€IÔÑÔÐØ;� � ˜;Ð(:Ñ;Ô;¸CÀÀcÑJÔJ€I€I€IðKøøøð €ð8Ø Ð Ð Ð Ð Ð Ð øØð8ð8ð8Ø€M€M€Mà ˆ6Œ;�t tÐ ,Ñ ,Ô ,€Dà€wˆt�YÑÔð8ð 8ð 8ð 8ð 8øøð8øøøð< ÐØ×ÒØFÐF�C�C˜‘I”IÐFÑFÔFñHôHðHð:ð:ð:ðzuBðuBðuBðp2@ð2@ð2@ðt ð ð ð ððð(ððð:'ð'ð'ðT=ð=ð=ð*ððð„7‡>‚>Ð;Ñ<Ô<ð'NØ Œ�ŠÐ=Ñ>Ô>ð'NðððððBNðNðNðÔ&€ ð ð ð ð ð ˜Iñ ô ð ðkðkðkðkðkñkôkðkð\ˆ{‰}Œ}€ ð'ð'ð'ð'ð "ð"ð"ðJððð>Ô € ð\ð\ð\ð\ð~GðGðGðGðGñGôGðGðT&ð&ð&ð&ð\nðnðnðbððð>Y>ðY>ðY>ðBððð$ 3ð 3ð 3ð&MðMðMð !ð!ð!ð@ððð,ððð*V DðV DðV DðV DðV DˆfñV DôV DðV DðV DðV Ds$Í M)Í)+NÎNÎN$Î$+OÏO