2018-12-13 19:24:34 -08:00
package widgets
import (
2018-12-13 21:59:45 -08:00
"fmt"
2018-12-13 19:24:34 -08:00
"log"
"os/exec"
"strconv"
"strings"
)
2019-02-28 16:29:52 -08:00
func getProcs ( ) ( [ ] Proc , error ) {
2018-12-13 19:24:34 -08:00
output , err := exec . Command ( "ps" , "-axo" , "pid:10,comm:50,pcpu:5,pmem:5,args" ) . Output ( )
if err != nil {
2018-12-13 21:59:45 -08:00
return nil , fmt . Errorf ( "failed to execute 'ps' command: %v" , err )
2018-12-13 19:24:34 -08:00
}
// converts to []string, removing trailing newline and header
2019-02-28 16:29:52 -08:00
linesOfProcStrings := strings . Split ( strings . TrimSuffix ( string ( output ) , "\n" ) , "\n" ) [ 1 : ]
2018-12-13 19:24:34 -08:00
2019-02-28 16:29:52 -08:00
procs := [ ] Proc { }
for _ , line := range linesOfProcStrings {
2020-06-26 11:50:15 -05:00
log . Printf ( "line is '%s', pid is '%s', cpu is '%s', mem is '%s'" , line , strings . TrimSpace ( line [ 0 : 10 ] ) , strings . TrimSpace ( line [ 63 : 68 ] ) , strings . TrimSpace ( line [ 69 : 74 ] ) )
2018-12-13 19:24:34 -08:00
pid , err := strconv . Atoi ( strings . TrimSpace ( line [ 0 : 10 ] ) )
if err != nil {
log . Printf ( "failed to convert PID to int: %v. line: %v" , err , line )
}
cpu , err := strconv . ParseFloat ( strings . TrimSpace ( line [ 63 : 68 ] ) , 64 )
if err != nil {
log . Printf ( "failed to convert CPU usage to float: %v. line: %v" , err , line )
}
mem , err := strconv . ParseFloat ( strings . TrimSpace ( line [ 69 : 74 ] ) , 64 )
if err != nil {
log . Printf ( "failed to convert Mem usage to float: %v. line: %v" , err , line )
}
2019-02-28 16:29:52 -08:00
proc := Proc {
Pid : pid ,
CommandName : strings . TrimSpace ( line [ 11 : 61 ] ) ,
FullCommand : line [ 74 : ] ,
2020-04-27 20:33:41 -05:00
CPU : cpu ,
2019-02-28 16:29:52 -08:00
Mem : mem ,
2018-12-13 19:24:34 -08:00
}
2019-02-28 16:29:52 -08:00
procs = append ( procs , proc )
2018-12-13 19:24:34 -08:00
}
2019-02-28 16:29:52 -08:00
return procs , nil
2018-12-13 19:24:34 -08:00
}