2012-02-21 16 views
27

मैंने वर्तमान में अपने सिस्टम (लिनक्स) पर चल रही प्रक्रियाओं की पिड्स की एक सूची बनाए रखी है, अब यह बहुत अच्छा होगा अगर मैं इस पिड से प्रक्रिया विवरण प्राप्त कर सकूं तो मैं syscall पर आया हूं गोलांग में .Getrusage() लेकिन मुझे वांछित परिणाम नहीं मिल रहे हैं। क्या किसी के पास इसका विचार हैअपने पिड से प्रक्रिया विवरण कैसे प्राप्त करें

+0

'syscall.Getrusage' से आप क्या परिणाम प्राप्त कर रहे हैं? –

+0

@ एटम: 'गेट्रेजेज - संसाधन उपयोग प्राप्त करने' के लिए लिनक्स मैन पेज देखें। – peterSO

+0

इनपुट 0x0 और 0x1 के लिए यह मुझे कुछ संरचना दे रहा है और मुझे लगता है कि इस फ़ंक्शन का उपयोग प्रक्रिया विवरण प्राप्त करने के लिए नहीं किया जा सकता है और जिसने प्रक्रिया शुरू की है, उस प्रक्रिया के तहत है जो नीचे कोड के साथ समस्या को हल करता है पीटर पीटर द्वारा जब मैं हूं कुछ प्रक्रियाओं के लिए मुझे प्राप्त होने वाली प्रत्येक बोलियों के पढ़ने की प्रक्रिया का विवरण कोई ऐसा डीआईआर मौजूद नहीं है क्योंकि यह उपस्थित नहीं हो सकता है क्योंकि प्रक्रिया को मार दिया गया हो सकता है। – geek

उत्तर

2

आप /proc/[pid]/stat देख सकते हैं। उदाहरण के लिए, जाओ 1,

का उपयोग कर
package main 

import (
    "fmt" 
    "io/ioutil" 
    "os" 
    "strconv" 
) 

func Pids() ([]int, error) { 
    f, err := os.Open(`/proc`) 
    if err != nil { 
     return nil, err 
    } 
    defer f.Close() 
    names, err := f.Readdirnames(-1) 
    if err != nil { 
     return nil, err 
    } 
    pids := make([]int, 0, len(names)) 
    for _, name := range names { 
     if pid, err := strconv.ParseInt(name, 10, 0); err == nil { 
      pids = append(pids, int(pid)) 
     } 
    } 
    return pids, nil 
} 

func ProcPidStat(pid int) ([]byte, error) { 
    // /proc/[pid]/stat 
    // https://www.kernel.org/doc/man-pages/online/pages/man5/proc.5.html 
    filename := `/proc/` + strconv.FormatInt(int64(pid), 10) + `/stat` 
    return ioutil.ReadFile(filename) 
} 

func main() { 
    pids, err := Pids() 
    if err != nil { 
     fmt.Println("pids:", err) 
     return 
    } 
    if len(pids) > 0 { 
     pid := pids[0] 
     stat, err := ProcPidStat(pid) 
     if err != nil { 
      fmt.Println("pid:", pid, err) 
      return 
     } 
     fmt.Println(`/proc/[pid]/stat:`, string(stat)) 
    } 
} 

आउटपुट:

/proc/[pid]/stat: 1 (init) S 0 1 1 0 -1 4202752 11119 405425 21 57 78 92 6643 527 20 0 1 0 3 24768512 563 184467440737095 
45

यह नहीं हो सकता है वास्तव में क्या प्रश्नकर्ता चाहता था (वहाँ विवरण के लिए किस प्रकार प्रत्येक प्रक्रिया आईडी के लिए आवश्यक हैं पर बहुत स्पष्ट जानकारी नहीं है) है, लेकिन आप अपने पीआईडी ​​मार कमांड का उपयोग करके किसी कार्य के कुछ विवरण प्राप्त कर सकते हैं ps -p $PID (psप्रक्रिया की स्थिति के लिए कम किया जा रहा)

के रूप में डिफ़ॉल्ट विकल्प के साथ ps -p $PID इस रिटर्न:

  • पीआईडी: नियंत्रित टर्मिनल के नाम (यदि हो तो)
  • समय: प्रक्रिया आईडी
  • TTY इको कितना CPU समय निष्पादन के बाद से इस्तेमाल प्रक्रिया है (उदाहरण के लिए 00:00:02)
  • अध्यक्ष एवं प्रबंध निदेशक: आदेश है कि इस प्रक्रिया कहा जाता है (उदाहरण के लिए java)

अधिक इस प्रक्रिया आईडी के बारे में जानकारी -ओ विकल्पों ध्वज का उपयोग कर दिखाया जा सकता है। एक सूची के लिए, this documentation page देखें।

यहां एक उदाहरण है जो आपको एक विशेष प्रक्रिया पीआईडी ​​के तर्क, उपयोगकर्ता, समूह और मेमोरी उपयोग के साथ पूर्ण आदेश बताता है (ध्यान दें कि कितने झंडे प्रत्येक जोड़ी लेते हैं, और कमांड व्हाट्स स्पेस पैडिंग के साथ कैसे आउटपुट करता है):

ps -p $PID -o pid,vsz=MEMORY -o user,group=GROUP -o comm,args=ARGS 

युक्ति: कंसोल में मानव-पढ़ने के लिए उत्पादन के लिए, आर्ग अंतिम विकल्प बनाने - यह आम तौर पर सबसे लंबे समय तक हो जाएगा और कम अन्यथा कटौती हो सकता है।

6
ps -p PID -o comm= 

ऊपर कोड दर्ज करें जहां पीआईडी ​​प्रक्रिया का पीआईडी ​​है।

संबंधित मुद्दे