กระบวนการทำความเข้าใจ -
เมื่อคุณเขียนโค้ดและรันโปรแกรมบน Windows, MAC หรือ Linux ระบบปฏิบัติการของคุณจะสร้างกระบวนการ (เดียว) โดยใช้ทรัพยากรระบบ เช่น CPU, RAM, พื้นที่ดิสก์ และโครงสร้างข้อมูลในเคอร์เนลของระบบปฏิบัติการ กระบวนการถูกแยกออกจากกระบวนการอื่น โดยจะมองไม่เห็นว่ากระบวนการอื่นกำลังทำอะไรอยู่หรือรบกวนกระบวนการเหล่านั้น
หมายเหตุ: รหัสนี้จะต้องทำงานบน Linux เช่นเดียวกับระบบ เมื่อดำเนินการบน windows อาจมีข้อยกเว้น
เป้าหมายของระบบปฏิบัติการ -
เป้าหมายหลักสองประการของระบบปฏิบัติการคือการกระจายงานของกระบวนการอย่างยุติธรรมและตอบสนองต่อผู้ใช้ สิ่งเหล่านี้บรรลุผลโดยการติดตามกระบวนการที่ทำงานอยู่ทั้งหมด โดยให้เวลาแต่ละส่วนในการทำงานเล็กน้อยแล้วเปลี่ยนไปใช้กระบวนการอื่น คุณดูสถานะของกระบวนการได้ด้วยอินเทอร์เฟซแบบกราฟิก เช่น Task Manager บนคอมพิวเตอร์ที่ใช้ Windows, Activity Monitor (macOS) ของ Mac หรือคำสั่งบนสุดใน Linux
ในฐานะโปรแกรมเมอร์ เราสามารถเข้าถึงข้อมูลกระบวนการจากโปรแกรมของเราเองได้ แต่อย่างไร? เพียงแค่ใช้โมดูลระบบปฏิบัติการไลบรารีมาตรฐาน ฉันจะแสดงตัวอย่างให้คุณดู
# This script works only on linux/unix import os print(f" *** Process ID - {os.getpid()}") print(f" *** My User ID - {os.getuid()} and My Group ID - {os.getgid()} ") print(f" *** Current Working Directory is - {os.getcwd()}")
การเรียกใช้และหมุนกระบวนการระบบใหม่อาจเป็นประโยชน์อย่างมากสำหรับนักพัฒนาและผู้ดูแลระบบที่ต้องการทำให้งานระบบปฏิบัติการเฉพาะเป็นไปโดยอัตโนมัติ
Python มีโมดูลกระบวนการย่อย ซึ่งสามารถหมุนกระบวนการใหม่ ส่งและรับข้อมูลจากกระบวนการ และยังจัดการข้อผิดพลาดและรหัสส่งคืน
เอกสาร Python อย่างเป็นทางการแนะนำโมดูลกระบวนการย่อยสำหรับการเข้าถึงคำสั่งของระบบ
ฟังก์ชัน subprocess call() รอให้คำสั่งที่เรียกอ่านเสร็จสิ้น เราจะดูตัวอย่างด้านล่างเพื่อดึงข้อมูลพื้นที่ดิสก์ของระบบ
รหัสด้านล่างจะดำเนินการคำสั่ง df -h และรวบรวมข้อมูล จากนั้นเอาต์พุตจะถูกบันทึกไปยังดาต้าเฟรมของแพนด้าสำหรับการประมวลผลเพิ่มเติม
ตัวอย่าง
# python code to create a subprocess for extracting disk space on linux using df -h from io import StringIO import pandas as pd import subprocess import ast diskspace = "df" diskspace_arg = "-h" sp = subprocess.Popen([diskspace,diskspace_arg], stdout=subprocess.PIPE) b = StringIO(sp.communicate()[0].decode('utf-8')) df = pd.read_csv(b, sep=",") print(df)
ผลลัพธ์
<_io.StringIO object at 0x7ff67ef52798> Filesystem Size Used Avail Use% Mounted on 0 devtmpfs 7.8G 0 7.8G 0% /dev 1 tmpfs 7.8G 0 7.8G 0% /dev/shm 2 tmpfs 7.8G 33M 7.8G 1% /run 3 tmpfs 7.8G 0 7.8G 0% /sys/fs/... 4 /dev/xvda2 20G 16G 4.3G 79% / 5 /dev/xvdb 246G 16G 218G 7% /tdm 6 tmpfs 1.6G 0 1.6G 0% /run/use...
หากต้องการทราบผลลัพธ์ที่มีรายละเอียดเพิ่มเติมด้วยกระบวนการย่อย โปรดดูโค้ดด้านล่าง
ตัวอย่าง
from io import StringIO import pandas as pd import subprocess def uname_func(): uname = "uname" uname_arg = "-a" user_info = subprocess.call([uname, uname_arg]) return user_info def disk_func(): diskspace = "pydf" diskspace_arg = "-a" discinfo_df = diskspace stdout = subprocess.check_output([diskspace, diskspace_arg]) return stdout def main(): userinfo = uname_func() discinfo = disk_func() print("Displaying values now... ") # print(stdout.decode('utf-8')) print(discinfo.decode('utf-8')) print(type(discinfo.decode('utf-8'))) content = discinfo.decode('utf-8').split("\n") print(content) main()
ผลลัพธ์
Linux ip-00-000-00-000.xxxx.xxxx.xx.xx 0.00.0-000.el7.x86_64 #1 SMP Tue Aug 18 14:50:17 EDT 2020 x86_64 x86_64 x86_64 GNU/Linux Displaying values now... Filesystem Size Used Avail Use% Mounted on /dev/xvda2 20G 16G 4318M 78.9 [#####.] / devtmpfs 7918M 0 7918M 0.0 [......] /dev hugetlbfs 0 0 0 - [......] /dev/hugepages mqueue 0 0 0 - [......] /dev/mqueue devpts 0 0 0 - [......] /dev/pts tmpfs 7942M 0 7942M 0.0 [......] /dev/shm proc 0 0 0 - [......] /proc binfmt_misc 0 0 0 - [......] /proc/sys/fs/binfmt_misc tmpfs 7942M 32M 7909M 0.4 [......] /run tmpfs 1588M 0 1588M 0.0 [......] /run/user/1000 sysfs 0 0 0 - [......] /sys tmpfs 7942M 0 7942M 0.0 [......] /sys/fs/cgroup cgroup 0 0 0 - [......] /sys/fs/cgroup/blkio cgroup 0 0 0 - [......] /sys/fs/cgroup/cpu,cpuacct cgroup 0 0 0 - [......] /sys/fs/cgroup/cpuset cgroup 0 0 0 - [......] /sys/fs/cgroup/devices cgroup 0 0 0 - [......] /sys/fs/cgroup/freezer cgroup 0 0 0 - [......] /sys/fs/cgroup/hugetlb cgroup 0 0 0 - [......] /sys/fs/cgroup/memory cgroup 0 0 0 - [......] /sys/fs/cgroup/net_cls,net_prio cgroup 0 0 0 - [......] /sys/fs/cgroup/perf_event cgroup 0 0 0 - [......] /sys/fs/cgroup/pids cgroup 0 0 0 - [......] /sys/fs/cgroup/systemd pstore 0 0 0 - [......] /sys/fs/pstore configfs 0 0 0 - [......] /sys/kernel/config debugfs 0 0 0 - [......] /sys/kernel/debug securityfs 0 0 0 - [......] /sys/kernel/security /dev/xvdb 246G 16G 218G 6.4 [......] /tdm