Compare commits

...

28 Commits

Author SHA1 Message Date
Jakob P. Liljenberg 60f95a1a74
Update README.md 2022-01-13 16:54:23 +01:00
aristocratos 4bf71e6816
Merge pull request #181 from lwhsu/freebsd
Update FreeBSD install instructions
2020-08-10 18:05:06 +02:00
aristocratos e7648ffdad
Merge pull request #184 from wigust/guix
Added install instructions for Guix
2020-08-10 18:02:59 +02:00
Oleg Pykhalov 9a0e464188
Added install instructions for Guix 2020-08-10 18:56:37 +03:00
Li-Wen Hsu 2725b77917
Update FreeBSD install instructions 2020-08-08 22:42:17 +08:00
aristocratos 9f8a133493 Get bpytop! 2020-08-07 14:50:37 +02:00
aristocratos d2eb76ea5b Added links to bpytop 2020-08-02 20:30:40 +02:00
aristocratos 89bf185f6b
Merge pull request #175 from elboletaire/master
Remove extra space in debian prerm script
2020-07-22 13:12:01 +02:00
Òscar Casajuana ae8d7a9266
Remove extra space 2020-07-22 12:00:45 +02:00
aristocratos 071cde4a9c Added info for bug fixing [skip ci] 2020-07-20 12:44:54 +02:00
aristocratos c76573ac7d v0.9.25 Fix for crash on linux when 9p filesystem is present 2020-07-20 12:35:57 +02:00
Josh faaf3ca047
ignore 9p filesystems to fix hang on Crostini
This patch prevents bashtop from hanging when running in a Crostini container.  Crostini (Linux containers on ChromeOS) use the 9P filesystem for communication between various VMs and containers.
2020-07-19 03:04:46 -05:00
aristocratos b8cb8d34b1 v0.9.24 Fixes for OsX 2020-07-14 19:40:54 +02:00
aristocratos 4f7b332b15 v0.9.24 Fixes for OsX 2020-07-14 19:38:31 +02:00
aristocratos 70e844aa26 Fixed error handling for malformed osx-cpu-temp output 2020-07-14 17:51:36 +02:00
aristocratos 69232ceb0d Fixed psutil script crash on OSX 2020-07-14 17:34:24 +02:00
aristocratos 497041d748 Added psutil version info field [ci skip] 2020-07-13 11:30:27 +02:00
aristocratos 236e0f7dbb v0.9.23 Fixed sending signals to processes in OsX/BSD not working 2020-07-13 00:06:50 +02:00
aristocratos e91e0c7905 Changed Compatibility section to Prerequisites 2020-07-13 00:03:41 +02:00
aristocratos d8f1541afa Fixed kill/terminate/interrupt not working in OsX and FreeBSD 2020-07-12 14:33:08 +02:00
aristocratos c323816ec2 v0.9.22 Fixed security issues 2020-07-10 17:24:19 +02:00
aristocratos e775a09279 Additional installation instructions for OSX and added psutil version requirement 2020-07-10 17:21:55 +02:00
aristocratos d89735c7a4 Fixed insecure test import of psutil 2020-07-10 17:09:26 +02:00
aristocratos b71ae67eab Added handler for mktemp failure for psutil script and removed secondary mktemp command 2020-07-07 21:17:18 +02:00
aristocratos 196745fd9d v0.9.21 Added support for application cursor mode input and small fixes 2020-07-07 20:34:58 +02:00
aristocratos 30960326cf Fixed incorrect value calculation for reversed proc gradient 2020-07-07 20:33:12 +02:00
aristocratos 900cdc0a71 Added support for application cursor mode input 2020-07-07 12:35:48 +02:00
aristocratos a21fac6b84 Updated config comments for theme locations and added check for correct paths 2020-07-06 23:43:14 +02:00
8 changed files with 162 additions and 68 deletions

View File

@ -27,11 +27,12 @@ assignees: aristocratos
- Bashtop version:
- (Linux) Linux distribution and version:
- (Linux) Data collection type (/proc or psutil):
- Psutil version: `python3 -c "import psutil; print(psutil.version_info)"` (version 5.7.0 or above is required):
- (OSX/FreeBSD) Os release version:
- Terminal used:
- Font used:
- Bash version, "bash --version" (version 4.4 or above is required):
- Locales: output of "locale -v"
- Bash version, `bash --version` (version 4.4 or above is required):
- Locales: output of `locale -v`
**Additional context**

View File

@ -1,5 +1,31 @@
# Changelog
## v0.9.25
* Fixed: Crash when using "/proc" data collection and filesystem type is 9p, by @bolapara
## v0.9.24
* Fixed: Psutil script crash on OSX
* Fixed: Error handling for malformed osx-cpu-temp output
## v0.9.23
* Fixed: kill/terminate/interrupt process not working in OsX and FreeBSD
## v0.9.22
* Added: Added handler for mktemp failure for psutil script
* Removed: Secondary mktemp command for psutil script
* Fixed: Insecure test import of psutil changed
## v0.9.21
* Changed: Config file comments for theme locations
* Added: Check for correct theme file path prefix
* Added: Support for application cursor mode input
* Fixed: Incorrect value calculation for reversed proc gradient
## v0.9.20
* Fixed: Psutil script security issue when placed directly in temp folder

View File

@ -6,6 +6,8 @@
* Is it a requested change or feature?
* If not, open a feature request to get feedback before making a pull request.
* If it's a fix for a unreported bug, make a bug report and link the pull request.
* Split up multiple unrelated changes in multiple pull requests.
* [Shellcheck](https://github.com/koalaman/shellcheck) your work. Current shellsheck exceptions at the beginning of [bashtop](bashtop).

View File

@ -1,4 +1,4 @@
#!/bin/bash
echo -e "[\033[1;33m removing packet from the system \033[0m]"
echo -e "[\033[1;33m removing packet from the system \033[0m]"

BIN
Imgs/bpytop.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

107
README.md
View File

@ -12,15 +12,26 @@
[![Sponsor](https://img.shields.io/badge/-Sponsor-red?logo=github)](https://github.com/sponsors/aristocratos)
[![Coffee](https://img.shields.io/badge/-Buy%20me%20a%20Coffee-grey?logo=Ko-fi)](https://ko-fi.com/aristocratos)
### C++ Version
##### 18 September 2021
![btop++](https://raw.githubusercontent.com/aristocratos/btop/main/Img/logo.png)
The C++ version of bashtop - btop++ is available.
Get it at https://github.com/aristocratos/btop
#
## Index
* [Documents](#documents)
* [Description](#description)
* [Features](#features)
* [Themes](#themes)
* [Upcoming](#upcoming) (Python port)
* [Support and funding](#support-and-funding)
* [Compatibility](#compatibility) (OSX and FreeBSD Support)
* [Prerequisites](#prerequisites)
* [Dependencies](#dependencies)
* [Screenshots](#screenshots)
* [Installation](#installation)
@ -28,6 +39,7 @@
* [TODO](#todo)
* [License](#license)
## Documents
#### [CHANGELOG.md](CHANGELOG.md)
@ -65,20 +77,6 @@ User created themes should be placed in `$HOME/.config/bashtop/user_themes` to b
Let me know if you want to contribute with new themes.
## Upcoming
~~Currently rewriting to use python3 [psutil](https://github.com/giampaolo/psutil) for data collection instead of linux specific tools.
This will add python 3 and psutil as dependencies, but will make bashtop cross platform compatible.~~
~~This will be integrated in to main version when done and add the possibility to switch between psutil and linux tools for users running linux.~~
Bashtop is now Mac OS X and FreeBSD compatible!
#### Python port: bpytop
Currently working full time on this during my vacation :)
I'm aiming to have a first release by end of July.
## Support and funding
Bug fixes and updates might be slow during normal workdays since I work full time as an industrial worker and don't have much time or energy left during the week.
@ -94,21 +92,21 @@ Also added donation links for [paypal](https://paypal.me/aristocratos) and [ko-f
Any support is greatly appreciated!
## Compatibility
## Prerequisites
Should work on most modern linux distributions, on Mac OS X and on FreeBSD.
#### Mac Os X
Will not display correctly on the standard terminal on OSX!
Will not display correctly in the standard terminal!
Recommended alternative [iTerm2](https://www.iterm2.com/)
Will also need to be run as superuser on OSX to display stats for processes not owned by user.
Will also need to be run as superuser to display stats for processes not owned by user.
The disk io stats on OSX and FreeBSD shows iostats for all disks at the top instead of per disk.
#### Linux, Mac Os X and FreeBSD
For correct display, a terminal with support for:
* 24-bit truecolor
* Wide characters
* 24-bit truecolor ([See list of terminals with truecolor support](https://gist.github.com/XVilka/8346728))
* Wide characters (Are sometimes problematic in web-based terminals)
Also needs a UTF8 locale and a font that covers:
@ -143,7 +141,7 @@ Bash version 5 is highly recommended to make use of $EPOCHREALTIME variable inst
**[Python3](https://www.python.org/downloads/)** (v3.6 or later)
**[psutil python module](https://github.com/giampaolo/psutil)**
**[psutil python module](https://github.com/giampaolo/psutil)** (v5.7.0 or later)
## Optionals for additional stats
@ -176,11 +174,27 @@ Options menu.
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
```
>Install dependencies
>If you got python 3.6 or later installed outside of brew:
``` bash
brew install bash coreutils gnu-sed python3 git
pip3 install psutil
sudo python3 -m ensurepip
sudo python3 -m pip install psutil
```
>If you haven't got python3 installed:
```
brew install python3
python3 -m pip install psutil
```
>Install dependencies
``` bash
brew install bash coreutils gnu-sed git
```
>Install optional dependency osx-cpu-temp
@ -194,9 +208,7 @@ brew install osx-cpu-temp
>Install with pkg and pip
``` bash
sudo pkg install coreutils gsed python3 git
sudo python3 -m ensurepip
sudo pip3 install psutil
sudo pkg install coreutils gsed git py37-psutil
```
#### Manual installation Linux, OSX and FreeBSD
@ -215,6 +227,16 @@ sudo make install
sudo make uninstall
```
#### FreeBSD package
Available in [FreeBSD ports](https://www.freshports.org/sysutils/bashtop/)
Install pre-built pacakge
``` bash
sudo pkg install bashtop
```
#### Arch based
Available in the AUR as [bashtop-git](https://aur.archlinux.org/packages/bashtop-git/)
@ -241,6 +263,16 @@ Or use quick installation:
sudo ./build --remove
```
#### Guix based
Available in [official Guix repository](https://git.savannah.gnu.org/cgit/guix.git/tree/gnu/packages/admin.scm) since 6bbd0fd2
>Installation
``` bash
guix install bashtop
```
#### Ubuntu based
Available in [official Ubuntu repository](https://launchpad.net/ubuntu/+source/bashtop) since Ubuntu 20.10
@ -295,21 +327,25 @@ Config files stored in "$HOME/.config/bashtop" folder
#### bashtop.cfg: (auto generated if not found)
```bash
#? Config file for bashtop v. 0.9.9
#? Config file for bashtop v. 0.9.21
#* Color theme, looks for a .theme file in "$HOME/.config/bashtop/themes" and "$HOME/.config/bashtop/user_themes", "Default" for builtin default theme
#* Color theme, looks for a .theme file in "$HOME/.config/bashtop/themes" and "$HOME/.config/bashtop/user_themes"
#* Should be prefixed with either "themes/" or "user_themes/" depending on location, "Default" for builtin default theme
color_theme="Default"
#* Update time in milliseconds, increases automatically if set below internal loops processing time, recommended 2000 ms or above for better sample times for graphs
update_ms="2500"
#* Processes sorting, "pid" "program" "arguments" "threads" "user" "memory" "cpu lazy" "cpu responsive" "tree"
#* "cpu lazy" updates sorting over time, "cpu responsive" updates sorting directly at a cpu usage cost
#* Processes sorting, "pid" "program" "arguments" "threads" "user" "memory" "cpu lazy" "cpu responsive"
#* "cpu lazy" updates sorting over time, "cpu responsive" updates sorting directly
proc_sorting="cpu lazy"
#* Reverse sorting order, "true" or "false"
proc_reversed="false"
#* Show processes as a tree
proc_tree="false"
#* Check cpu temperature, only works if "sensors", "vcgencmd" or "osx-cpu-temp" commands is available
check_temp="true"
@ -364,8 +400,7 @@ Might finish off items out of order since I usually work on multiple at a time.
- [ ] Add gpu temp and usage. (If feasible)
- [x] Add io stats for disks.
- [ ] Add cpu and mem stats for docker containers. (If feasible)
- [ ] Change process list to line scroll instead of page change.
- [ ] Add option for custom color gradient in process list in theme settings.
- [x] Change process list to line scroll instead of page change.
- [ ] Add optional window for tailing log files.
- [ ] Add options for resizing all boxes.
- [ ] Add command line argument parsing.

77
bashtop
View File

@ -93,7 +93,7 @@ banner=(
"██╔══██╗██╔══██║╚════██║██╔══██║ ██║ ██║ ██║██╔═══╝ "
"██████╔╝██║ ██║███████║██║ ██║ ██║ ╚██████╔╝██║ "
"╚═════╝ ╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ")
declare version="0.9.20"
declare version="0.9.25"
#* Get latest version of BashTOP from https://github.com/aristocratos/bashtop
@ -122,7 +122,8 @@ read tty_height tty_width < <(${stty} size)
#? Any changes made here will be ignored if config file exists
aaa_config() { : ; } #! Do not remove this line!
#* Color theme, looks for a .theme file in "$HOME/.config/bashtop/themes" and "$HOME/.config/bashtop/user_themes", "Default" for builtin default theme
#* Color theme, looks for a .theme file in "$HOME/.config/bashtop/themes" and "$HOME/.config/bashtop/user_themes"
#* Should be prefixed with either "themes/" or "user_themes/" depending on location, "Default" for builtin default theme
color_theme="Default"
#* Update time in milliseconds, increases automatically if set below internal loops processing time, recommended 2000 ms or above for better sample times for graphs
@ -492,7 +493,7 @@ color_init_() { #? Check for theme file and set colors
done
#* Check if theme set in config exists and source it if it does
if [[ -n ${color_theme} && ${color_theme} != "Default" && -e "${config_dir}/${color_theme%.theme}.theme" ]]; then
if [[ -n ${color_theme} && ${color_theme} != "Default" && ${color_theme} =~ (themes/)|(user_themes/) && -e "${config_dir}/${color_theme%.theme}.theme" ]]; then
# shellcheck source=/dev/null
source "${config_dir}/${color_theme%.theme}.theme"
sourced=1
@ -2128,8 +2129,10 @@ collect_cpu_temps() { #? Collect cpu temperatures
#* Get CPU package temp for Rapberry Pi cpus and for OSX
elif [[ $sensor_comm != "sensors" && -n ${misc_var} ]]; then
cpu[temp_0]="${misc_var#temp=}"
cpu[temp_unit]="°${cpu[temp_0]:(-1)}"; cpu[temp_0]=${cpu[temp_0]%.*}; if [[ ${cpu[temp_0]::1} == "+" ]]; then cpu[temp_0]=${cpu[temp_0]#+}; fi
cpu[temp_high]="75"; cpu[temp_crit]=$((cpu[temp_high]+10))
cpu[temp_unit]="°${cpu[temp_0]:(-1)}"; cpu[temp_0]=${cpu[temp_0]%%.*}; if [[ ${cpu[temp_0]::1} == "+" ]]; then cpu[temp_0]=${cpu[temp_0]#+}; fi
if [[ -z ${cpu[temp_high]} ]]; then
cpu[temp_high]="75"; cpu[temp_crit]=$((cpu[temp_high]+10))
fi
#* Copy cpu temp to cores
for((i=1;i<=threads;i++)); do
@ -2232,7 +2235,7 @@ collect_mem() { #? Collect memory information from "/proc/meminfo"
if ! py_command -a df_array "get_disks(exclude='squashfs'${filtering})"; then psutil_disk_fail=1; psutil_on="false"; fi
fi
if [[ $psutil_on == false ]]; then
readarray -t df_array < <(${df} -x squashfs -x tmpfs -x devtmpfs -x overlay 2>/dev/null || true)
readarray -t df_array < <(${df} -x squashfs -x tmpfs -x devtmpfs -x overlay -x 9p 2>/dev/null || true)
fi
for df_line in "${df_array[@]:1}"; do
line_array=(${df_line})
@ -3220,7 +3223,7 @@ draw_processes() { #? Draw processes and values to screen
local reverse_string reverse_pos order_left="───────────┤" filter_string current_num detail_location det_no_add com_fg pg_arrow_up_fg pg_arrow_down_fg p_height=$((height-3))
local pid=0 pid_graph pid_step_r pid_step_g pid_step_b pid_add_r pid_add_g pid_add_b bg_add bg_step proc_start up_fg down_fg page_up_fg page_down_fg this_box=processes
local d_width=${box[details_width]} d_height=${box[details_height]} d_line=${box[details_line]} d_col=${box[details_col]}
local detail_graph_width=$((d_width/3+2)) detail_graph_height=$((d_height-1)) kill_fg det_mod fg_add_r fg_add_g fg_add_b fg_inv
local detail_graph_width=$((d_width/3+2)) detail_graph_height=$((d_height-1)) kill_fg det_mod fg_add_r fg_add_g fg_add_b
local right_width=$((d_width-detail_graph_width-2))
local right_col=$((d_col+detail_graph_width+4))
local -a pid_rgb=(${theme[proc_misc]}) fg_rgb=(${theme[main_fg_dec]})
@ -3229,14 +3232,23 @@ draw_processes() { #? Draw processes and values to screen
if [[ $argument == "now" ]]; then skip_process_draw=1; fi
if [[ $proc_gradient == true ]]; then
if ((fg_r+fg_g+fg_b<(255*3)/2)); then fg_inv=1; fi
fg_add_r="${fg_inv:+-}$(( (fg_r-(fg_r/6) )/height))"
fg_add_g="${fg_inv:+-}$(( (fg_g-(fg_g/6) )/height))"
fg_add_b="${fg_inv:+-}$(( (fg_b-(fg_b/6) )/height))"
if ((fg_r+fg_g+fg_b<(255*3)/2)); then
fg_add_r="$(( (fg_r-255-((fg_r-255)/6) )/height))"
fg_add_g="$(( (fg_g-255-((fg_g-255)/6) )/height))"
fg_add_b="$(( (fg_b-255-((fg_b-255)/6) )/height))"
pid_add_r="${fg_inv:+-}$(( (pid_r-(pid_r/6) )/height))"
pid_add_g="${fg_inv:+-}$(( (pid_g-(pid_g/6) )/height))"
pid_add_b="${fg_inv:+-}$(( (pid_b-(pid_b/6) )/height))"
pid_add_r="$(( (pid_r-255-((pid_r-255)/6) )/height))"
pid_add_g="$(( (pid_g-255-((pid_g-255)/6) )/height))"
pid_add_b="$(( (pid_b-255-((pid_b-255)/6) )/height))"
else
fg_add_r="$(( (fg_r-(fg_r/6) )/height))"
fg_add_g="$(( (fg_g-(fg_g/6) )/height))"
fg_add_b="$(( (fg_b-(fg_b/6) )/height))"
pid_add_r="$(( (pid_r-(pid_r/6) )/height))"
pid_add_g="$(( (pid_g-(pid_g/6) )/height))"
pid_add_b="$(( (pid_b-(pid_b/6) )/height))"
fi
fi
unset proc_out
@ -4222,7 +4234,8 @@ killer_() { #? Kill process with selected signal
local kill_op="$1" kill_pid="$2" killer_out killer_box col line program keypress selected selected_int=0 sig confirmed=0 option killer_pause status msg
local -a options=("yes" "no")
if ! program="$(ps -o comm --no-header -p ${kill_pid})"; then return; fi
if ! program="$(ps -o comm -p ${kill_pid})"; then return
else program="$(tail -n1 <<<"$program")"; fi
case $kill_op in
t|T) kill_op="terminate"; sig="SIGTERM" ;;
@ -4356,10 +4369,10 @@ get_key() { #? Get one key from standard input and translate key code to readabl
if [[ -z $key && $esc -eq 1 ]]; then key="escape"
elif [[ $esc -eq 1 ]]; then
case "${key}" in
'[A'*) key="up" ;;
'[B'*) key="down" ;;
'[D'*) key="left" ;;
'[C'*) key="right" ;;
'[A'*|'OA'*) key="up" ;;
'[B'*|'OB'*) key="down" ;;
'[D'*|'OD'*) key="left" ;;
'[C'*|'OC'*) key="right" ;;
'[2~') key="insert" ;;
'[3~') key="delete" ;;
'[H'*) key="home" ;;
@ -4750,7 +4763,7 @@ if [[ $use_psutil == true ]]; then
else
exit 1
fi
elif [[ $use_psutil == true ]] && ! python3 -c "import psutil" >/dev/null 2>&1; then
elif [[ $use_psutil == true ]] && ! (cd / && python3 -c "import psutil") >/dev/null 2>&1; then
echo "Error: Missing python3 psutil module!"
if [[ $system == "Linux" ]]; then
use_psutil="false"
@ -4816,8 +4829,15 @@ if [[ $use_psutil == true ]]; then
return 0
}
pytmpdir=$(mktemp -d "${TMPDIR:-/tmp}"/XXXXXXXXXXXX)
pywrapper=$(mktemp "${pytmpdir}"/bashtop.psutil.XXXX)
if ! pytmpdir=$(mktemp -d "${TMPDIR:-/tmp}"/XXXXXXXXXXXX); then
if [[ $system == "Linux" ]]; then
use_psutil="false"
else
echo "ERROR: Failed setting up temp directory for psutil script!"
exit 1
fi
else
pywrapper="${pytmpdir}/bashtop.psutil"
cat << 'EOF' > "${pywrapper}"
import os, sys, subprocess, re, time, psutil
@ -5044,11 +5064,14 @@ def get_proc(sorting='cpu lazy', tree=False, prog_len=0, arg_len=0, search='', r
print(f"{'Pid:':>7} {'Program:':<{prog_len}}", f"{'Arguments:':<{arg_len-4}}" if arg_len else '', f"{'Threads:' if arg_len else ' Tr:'} {'User:':<9}Mem%{'Cpu%':>11}", sep='')
for p in sorted(psutil.process_iter(['pid', 'name', 'cmdline', 'num_threads', 'username', 'memory_percent', 'cpu_percent', 'cpu_times', 'create_time'], err), key=lambda p: eval(sort_cmd), reverse=reverse):
if p.info['name'] == 'idle':
if p.info['name'] == 'idle' or p.info['name'] == err or p.info['pid'] == err:
continue
if p.info['cpu_times'] == err:
if p.info['cmdline'] == err:
p.info['cmdline'] = ""
if p.info['username'] == err:
p.info['username'] = "?"
if p.info['num_threads'] == err:
p.info['num_threads'] = 0
p.info['cmdline'] = ''
if search:
found = False
for value in [ p.info['name'], ' '.join(p.info['cmdline']), str(p.info['pid']), p.info['username'] ]:
@ -5105,6 +5128,8 @@ def proc_tree(width: int, sorting: str = 'cpu lazy', reverse: bool = True, max_l
if getinfo and cont:
if getinfo['cpu_times'] == err:
getinfo['num_threads'] = 0
if p.info['username'] == err:
p.info['username'] = "?"
cpu = getinfo['cpu_percent'] if proc_per_cpu else (getinfo['cpu_percent'] / psutil.cpu_count())
print(f"{getinfo['num_threads']:>4} " if getinfo['num_threads'] < 1000 else '999> ',
f"{getinfo['username']:<9.9}" if len(getinfo['username']) < 10 else f"{getinfo['username'][:8]:<8}+",
@ -5220,7 +5245,7 @@ while command != 'quit':
print('/EOL')
#print(f'{command}', file=sys.stderr)
EOF
fi
fi
#* Set up traps for ctrl-c, soft kill, window resize, ctrl-z and resume from ctrl-z

View File

@ -226,11 +226,14 @@ def get_proc(sorting='cpu lazy', tree=False, prog_len=0, arg_len=0, search='', r
print(f"{'Pid:':>7} {'Program:':<{prog_len}}", f"{'Arguments:':<{arg_len-4}}" if arg_len else '', f"{'Threads:' if arg_len else ' Tr:'} {'User:':<9}Mem%{'Cpu%':>11}", sep='')
for p in sorted(psutil.process_iter(['pid', 'name', 'cmdline', 'num_threads', 'username', 'memory_percent', 'cpu_percent', 'cpu_times', 'create_time'], err), key=lambda p: eval(sort_cmd), reverse=reverse):
if p.info['name'] == 'idle':
if p.info['name'] == 'idle' or p.info['name'] == err or p.info['pid'] == err:
continue
if p.info['cpu_times'] == err:
if p.info['cmdline'] == err:
p.info['cmdline'] = ""
if p.info['username'] == err:
p.info['username'] = "?"
if p.info['num_threads'] == err:
p.info['num_threads'] = 0
p.info['cmdline'] = ''
if search:
found = False
for value in [ p.info['name'], ' '.join(p.info['cmdline']), str(p.info['pid']), p.info['username'] ]:
@ -287,6 +290,8 @@ def proc_tree(width: int, sorting: str = 'cpu lazy', reverse: bool = True, max_l
if getinfo and cont:
if getinfo['cpu_times'] == err:
getinfo['num_threads'] = 0
if p.info['username'] == err:
p.info['username'] = "?"
cpu = getinfo['cpu_percent'] if proc_per_cpu else (getinfo['cpu_percent'] / psutil.cpu_count())
print(f"{getinfo['num_threads']:>4} " if getinfo['num_threads'] < 1000 else '999> ',
f"{getinfo['username']:<9.9}" if len(getinfo['username']) < 10 else f"{getinfo['username'][:8]:<8}+",