gotop icon indicating copy to clipboard operation
gotop copied to clipboard

Processes widget fails with ps from BusyBox

Open Mikiya83 opened this issue 6 years ago • 5 comments

Required information:

  • gotop version (gotop -v): 2.0.1
  • The output of uname -a: Linux 4.2.8 #1 SMP Fri Dec 28 00:59:23 CST 2018 x86_64 GNU/Linux
  • Terminal emulator (e.g. iTerm or gnome terminal):
  • Any relevenat hardware info: QNAP QTS 4.3.6
  • tmux version if using tmux:

Logs : "11:19:36 proc_linux.go:14: failed to retrieve processes: failed to execute 'ps' command: exit status 1"

On QNAP devices, ps command used Busybox version :

BusyBox v1.24.1 (2018-12-28 02:26:16 CST) multi-call binary.

Usage: ps [-o COL1,COL2=HEADER] [-T]

Show list of processes

        -o COL1,COL2=HEADER     Select columns for display
        -T                      Show threads

QNAP Options:
        --columns N

This version does not have "-axo" options so it fails. By default it shows processes of all users. Is it possible to have a version for BusyBox users ? Thanks !

Mikiya83 avatar Feb 10 '19 10:02 Mikiya83

Busbox support sounds good to me. It would probably require us to do some check on the environment on start and adjust the ps flags. I'm curious what the adjustments would be. Is that actually the entirety of the man page? :joy: If not, could you copy the contents into a gist or link it?

So can you test this command: ps -o pid,comm,pcpu,pmem,args? Also, there's been some issues with the ps columns being cropped, so if that happens when running that, then you can try doing ps -o pid,comm=superlongheaderasdfasdfasdfsdaf etc.

cjbassi avatar Feb 11 '19 05:02 cjbassi

Unfortunately it is the complete manpage :(

[~] # ps -h
ps: invalid option -- 'h'
BusyBox v1.24.1 (2018-12-28 02:26:16 CST) multi-call binary.

Usage: ps [-o COL1,COL2=HEADER] [-T]

Show list of processes

        -o COL1,COL2=HEADER     Select columns for display
        -T                      Show threads

QNAP Options:
        --columns N
[~] #

With yours commands i get :

ps -o pid,comm,pcpu,pmem,args 
ps: bad -o argument 'pcpu', supported arguments: user,group,comm,args,pid,ppid,pgid,etime,nice,rgroup,ruser,time,tty,vsz,stat,rss

I removed pcpu and pmem (because it's not recognized) and i get things like this :

[~] # ps -o pid,comm,args
  PID  COMMAND          Command
    1 init             init
    2 kthreadd         [kthreadd]
    3 ksoftirqd/0      [ksoftirqd/0]
    5 kworker/0:0H     [kworker/0:0H]
    7 rcu_sched        [rcu_sched]
...

I don't see any problems with cropping (i have some very long "Command" entries).

Mikiya83 avatar Feb 11 '19 06:02 Mikiya83

So it looks like ps on busybox doesn't support per process cpu usage or memory reporting. So we should check if we're on busybox and then our only option is to remove the unsupported flags and only show PID and command.

cjbassi avatar Feb 11 '19 07:02 cjbassi

The only way i find to get cpu or memory reporting is to use top. If you need other tests, i'm available ;)

Mikiya83 avatar Feb 11 '19 16:02 Mikiya83

Some new ideas about different ways to fix this:

  1. detect when a system uses busybox, then use cli args appropriate for ps on a busybox system, but we won't be able to get per-process cpu or memory usage
  2. require users to download and install procps on their system as a workaround
  3. directly gather process information ourselves by traversing /proc, or use the implementation provided by gopsutil

3 sounds best to me. We were originally using gopsutil to gather process information but I forget why we switched of it. And it should be easy to test gopsutil's implementation (I've just been busy).

cjbassi avatar Apr 22 '19 20:04 cjbassi