@ -3,6 +3,7 @@
package process
package process
import (
import (
"bytes"
"encoding/json"
"encoding/json"
"errors"
"errors"
"fmt"
"fmt"
@ -84,9 +85,19 @@ func (p *Process) Name() (string, error) {
func ( p * Process ) Exe ( ) ( string , error ) {
func ( p * Process ) Exe ( ) ( string , error ) {
return p . fillFromExe ( )
return p . fillFromExe ( )
}
}
// Cmdline returns the command line arguments of the process as a string with
// each argument separated by 0x20 ascii character.
func ( p * Process ) Cmdline ( ) ( string , error ) {
func ( p * Process ) Cmdline ( ) ( string , error ) {
return p . fillFromCmdline ( )
return p . fillFromCmdline ( )
}
}
// CmdlineSlice returns the command line arguments of the process as a slice with each
// element being an argument.
func ( p * Process ) CmdlineSlice ( ) ( [ ] string , error ) {
return p . fillSliceFromCmdline ( )
}
func ( p * Process ) CreateTime ( ) ( int64 , error ) {
func ( p * Process ) CreateTime ( ) ( int64 , error ) {
_ , _ , _ , createTime , _ , err := p . fillFromStat ( )
_ , _ , _ , createTime , _ , err := p . fillFromStat ( )
if err != nil {
if err != nil {
@ -403,6 +414,25 @@ func (p *Process) fillFromCmdline() (string, error) {
return strings . Join ( ret , " " ) , nil
return strings . Join ( ret , " " ) , nil
}
}
func ( p * Process ) fillSliceFromCmdline ( ) ( [ ] string , error ) {
pid := p . Pid
cmdPath := common . HostProc ( strconv . Itoa ( int ( pid ) ) , "cmdline" )
cmdline , err := ioutil . ReadFile ( cmdPath )
if err != nil {
return nil , err
}
if cmdline [ len ( cmdline ) - 1 ] == 0 {
cmdline = cmdline [ : len ( cmdline ) - 1 ]
}
parts := bytes . Split ( cmdline , [ ] byte { 0 } )
var strParts [ ] string
for _ , p := range parts {
strParts = append ( strParts , string ( p ) )
}
return strParts , nil
}
// Get IO status from /proc/(pid)/io
// Get IO status from /proc/(pid)/io
func ( p * Process ) fillFromIO ( ) ( * IOCountersStat , error ) {
func ( p * Process ) fillFromIO ( ) ( * IOCountersStat , error ) {
pid := p . Pid
pid := p . Pid