Compare commits

..

No commits in common. "master" and "v0.9.21" have entirely different histories.

8 changed files with 49 additions and 122 deletions

View File

@ -27,12 +27,11 @@ 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,24 +1,5 @@
# 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

View File

@ -6,8 +6,6 @@
* 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]"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

View File

@ -12,26 +12,15 @@
[![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)
* [Prerequisites](#prerequisites)
* [Compatibility](#compatibility) (OSX and FreeBSD Support)
* [Dependencies](#dependencies)
* [Screenshots](#screenshots)
* [Installation](#installation)
@ -39,7 +28,6 @@ Get it at https://github.com/aristocratos/btop
* [TODO](#todo)
* [License](#license)
## Documents
#### [CHANGELOG.md](CHANGELOG.md)
@ -77,6 +65,20 @@ 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.
@ -92,21 +94,21 @@ Also added donation links for [paypal](https://paypal.me/aristocratos) and [ko-f
Any support is greatly appreciated!
## Prerequisites
## Compatibility
#### Mac Os X
Should work on most modern linux distributions, on Mac OS X and on FreeBSD.
Will not display correctly in the standard terminal!
Will not display correctly on the standard terminal on OSX!
Recommended alternative [iTerm2](https://www.iterm2.com/)
Will also need to be run as superuser to display stats for processes not owned by user.
Will also need to be run as superuser on OSX to display stats for processes not owned by user.
#### Linux, Mac Os X and FreeBSD
The disk io stats on OSX and FreeBSD shows iostats for all disks at the top instead of per disk.
For correct display, a terminal with support for:
* 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)
* 24-bit truecolor
* Wide characters
Also needs a UTF8 locale and a font that covers:
@ -141,7 +143,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)** (v5.7.0 or later)
**[psutil python module](https://github.com/giampaolo/psutil)**
## Optionals for additional stats
@ -174,27 +176,11 @@ Options menu.
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
```
>If you got python 3.6 or later installed outside of brew:
``` bash
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
brew install bash coreutils gnu-sed python3 git
pip3 install psutil
```
>Install optional dependency osx-cpu-temp
@ -208,7 +194,9 @@ brew install osx-cpu-temp
>Install with pkg and pip
``` bash
sudo pkg install coreutils gsed git py37-psutil
sudo pkg install coreutils gsed python3 git
sudo python3 -m ensurepip
sudo pip3 install psutil
```
#### Manual installation Linux, OSX and FreeBSD
@ -227,16 +215,6 @@ 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/)
@ -263,16 +241,6 @@ 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
@ -400,7 +368,8 @@ 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)
- [x] Change process list to line scroll instead of page change.
- [ ] Change process list to line scroll instead of page change.
- [ ] Add option for custom color gradient in process list in theme settings.
- [ ] Add optional window for tailing log files.
- [ ] Add options for resizing all boxes.
- [ ] Add command line argument parsing.

39
bashtop
View File

@ -93,7 +93,7 @@ banner=(
"██╔══██╗██╔══██║╚════██║██╔══██║ ██║ ██║ ██║██╔═══╝ "
"██████╔╝██║ ██║███████║██║ ██║ ██║ ╚██████╔╝██║ "
"╚═════╝ ╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ")
declare version="0.9.25"
declare version="0.9.21"
#* Get latest version of BashTOP from https://github.com/aristocratos/bashtop
@ -2129,10 +2129,8 @@ 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
if [[ -z ${cpu[temp_high]} ]]; then
cpu[temp_high]="75"; cpu[temp_crit]=$((cpu[temp_high]+10))
fi
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))
#* Copy cpu temp to cores
for((i=1;i<=threads;i++)); do
@ -2235,7 +2233,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 -x 9p 2>/dev/null || true)
readarray -t df_array < <(${df} -x squashfs -x tmpfs -x devtmpfs -x overlay 2>/dev/null || true)
fi
for df_line in "${df_array[@]:1}"; do
line_array=(${df_line})
@ -4234,8 +4232,7 @@ 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 -p ${kill_pid})"; then return
else program="$(tail -n1 <<<"$program")"; fi
if ! program="$(ps -o comm --no-header -p ${kill_pid})"; then return; fi
case $kill_op in
t|T) kill_op="terminate"; sig="SIGTERM" ;;
@ -4763,7 +4760,7 @@ if [[ $use_psutil == true ]]; then
else
exit 1
fi
elif [[ $use_psutil == true ]] && ! (cd / && python3 -c "import psutil") >/dev/null 2>&1; then
elif [[ $use_psutil == true ]] && ! python3 -c "import psutil" >/dev/null 2>&1; then
echo "Error: Missing python3 psutil module!"
if [[ $system == "Linux" ]]; then
use_psutil="false"
@ -4829,15 +4826,8 @@ if [[ $use_psutil == true ]]; then
return 0
}
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"
pytmpdir=$(mktemp -d "${TMPDIR:-/tmp}"/XXXXXXXXXXXX)
pywrapper=$(mktemp "${pytmpdir}"/bashtop.psutil.XXXX)
cat << 'EOF' > "${pywrapper}"
import os, sys, subprocess, re, time, psutil
@ -5064,14 +5054,11 @@ 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' or p.info['name'] == err or p.info['pid'] == err:
if p.info['name'] == 'idle':
continue
if p.info['cmdline'] == err:
p.info['cmdline'] = ""
if p.info['username'] == err:
p.info['username'] = "?"
if p.info['num_threads'] == err:
if p.info['cpu_times'] == 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'] ]:
@ -5128,8 +5115,6 @@ 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}+",
@ -5245,7 +5230,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,14 +226,11 @@ 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' or p.info['name'] == err or p.info['pid'] == err:
if p.info['name'] == 'idle':
continue
if p.info['cmdline'] == err:
p.info['cmdline'] = ""
if p.info['username'] == err:
p.info['username'] = "?"
if p.info['num_threads'] == err:
if p.info['cpu_times'] == 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'] ]:
@ -290,8 +287,6 @@ 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}+",