โค้ดของผมrunในUbuntu นะครับ scriptนี้ใช้เพื่อCheckว่า ping internet ได้หรือไม่ และมีProcess openvpn /etc/openvpn/client.conf รันอยู่หรือไม่ครับ คือผมใช้Codeตามนี้ครับ
#!/usr/bin/python
import os,commands
check = commands.getoutput("ping -I eth0 -c 5 google.com | grep transmitted | cut -d, -f2 | cut -d' ' -f2 ")
rev=os.popen("pgrep -f 'openvpn /etc/openvpn/client.conf'")
check2=rev.readline()
rev.close()
print "["+check+"]"
print "["+check2+"]"ผลก็คือ ตัวแปร check ใช้ได้ตามที่คิดครับ(คือได้จำนวนpacketที่Receivedครับ) แต่ตัวแปรcheck2นี่ดิ ในขณะนั้นผมไม่ได้มีprocessชื่อ openvpn /etc/openvpn/client.conf รันอยู่แน่ๆ แต่มันกลับReturn PID กลับมาได้ ไม่เข้าใจเหมือนกันครับว่าPIDของอะไร เพราะรัน ps -ef | grep PID นั้นแล้วก็ไม่มีครับ
ใครมีวิธีแก้หรือรู้ว่าเป้นเพราะอะไรช่วยบอกทีครับ
กระทู้เก่าๆ จะย้ายตามไปในภายหลัง ตอนนี้ปิดการโพสต์กระทู้ไว้ เหลือไว้เฉพาะอ้างอิงเท่านั้น
อยากจะช่วยอยู่ครับ แต่อ่าน code ไม่รู้เรื่อง ลองแก้ใส่
<code ="python"> ... </code>คร่อมดูนะครับ
มันคือ pid ของตัวเอง
ลองเช็คแล้วครับไม่ใช่ PID ของตัวมันเองด้วยครับ
ผมหมายถึง pid ของ pgrep น่ะ ว่าแต่มันบอกแค่ pid เหรอ ผมว่าลอง ps auxw|grep xxx เลยดีกว่ามั๊ย เห็นเต็มๆ
ขอบคุณครับ เด็วจะลองดูครับ
เอ่อลองแล้วครับผมใช้ ps auxw | grep openvpn | cut -dt -f2 | cut -d’ ’ -f6
ครับ
ถ้าตามCommandlineปกติจะได้ค่าPIDครับ แต่พอใช้ในScriptผมใช้เป็น
rec=os.popen("ps auxw | grep openvpn | cut -dt -f2 | cut -d' ' -f6") input=rec.readline()ก็ยังใช้ไม่ได้ครับ กลายเป็นค่าว่างเปล่าหรือไม่ก็0.0น่ะครับ
ใครมีวิธีอื่นช่วยบอกทีครับ หรือมีเว็บบอร์ดที่ไหนแนะนำช่วยบอกทีครับจะได้ไปถามที่นั่น จะเป็นเว็บเมืองนอกก็ได้นะครับหรือเว็บบอร์ดในไทยก็ได้ แต้ถ้าเป็นเมืองนอกขอเป็นภาษาอังกฤษครับ ช่วยแนะนำด้วยครับ
โดยส่วนตัวผมไม่คิดว่า pipe จะใช้ได้ใน popen ถ้าอยากทำก็คงต้อง เชื่อมกันเอง ถ้าอันนี้ผมจะทำ คงใช้แค่ popen(‘ps axuwx’) แล้วใช้ readline() มาหาเองทีละบรรทัด เร็วกว่า แน่นอนกว่า
อันนี้ไม่ได้ตอบคำถาม แต่ผมสงสัยว่า ทำไมตอน ping check ถึงใช้ commands.getoutputs ส่วนตอน grep หา pid ถึงใช้ popen
ก็เลยไปเปิด file commands.py ดู ก็เป็นไปตามที่คาด ข้างในมันห่อคำสั่งนี้ไว้
คือผมลองใช้ในแบบต่างๆดูน่ะครับ ผมไม่รู้ความแตกต่างเหมือนกันว่ามันแตกต่างกันยังไงและอันไหนน่าใช้มากกว่ากัน ช่วยแนะนำด้วยนะครับ ผมมือใหม่หัดเขียนPythonครับ
จากที่ผ่านมาสรุปคือผมไม่สามารถใช้ | ได้ใช่มั้ยครับ ต้องทำการรับค่าจากcommandหนึ่งแล้วนำมาตัดStringเองอีกทีถูกมั้ยครับ
หา่กใครมีIdeaอื่นๆช่วยบอกทีนะครับ
ผมคิดว่า Pipe นั้นใช้ได้นะครับ เพราะตัวอย่างแรกที่ใช้
commands.getoutput("ping -I eth0 -c 5.....")นั่นก็มี pipe เต็มไปหมดปัญหานี้ระบุยากว่าเป็นเพราะอะไร เพราะผมลองสั่งที่เครื่องผม
commands.getoutput("pgrep gnome-terminal")ที่เครื่องผมดู มันก็ทำงานได้ถูกต้องดี น้อง materaj ลอง workaround อย่างที่คุณ sugree บอกก่อนก็ได้ ถ้ามันทำงานได้ถูกต้อง ก็ใช้ไปก่อน มีเวลาค่อยกลับมาค้นว่า มันเกิดจากอะไรถ้าเป็นไปได้ก็ไม่แนะนำให้ไปเรียกโปรเซสอื่น มันกินแรงเครื่องโดยใช่เหตุ fork exec ไม่ใช่เรื่องดีงาม ถ้าชอบแนวนั้นใช้ shell script ก็พอ เปิดอ่าน /proc โลด (บ้าไปรึเปล่า)
ทำได้แล้วครับ ที่ผมใช้คือโค้ดตามนี้ครับ
check = commands.getoutput("ping -I eth1 -c 5 117.121.218.42 | grep transmitted | cut -d, -f2 | cut -d' ' -f2 ") check2= "" for line in os.popen("ps axuwx"): fields = line.split() if fields[10] == "openvpn" and fields[11] == "/etc/openvpn/client.conf": check2 = fields[1]ตามนี้ครับ คือที่ใช้Pythonแทนที่จะใช้Shell Scriptเพราะว่าตัวserverที่รันเนี่ยมันมีScript pythonอยู่แล้วหลายอันน่ะครับ แล้วอยากให้ใช้ภาษาเดียวในการทำScriptในเครื่องน่ะครับ