Quá trình hiểu -
Khi bạn viết mã và thực thi một chương trình trên Windows, MAC hoặc Linux, Hệ điều hành của bạn sẽ tạo một quy trình (đơn). Quá trình này sử dụng tài nguyên hệ thống như CPU, RAM, Dung lượng đĩa và cả cấu trúc dữ liệu trong nhân của hệ điều hành. Một quy trình được tách biệt với các quy trình khác — quy trình này không thể nhìn thấy những quy trình khác đang làm gì hoặc can thiệp vào chúng.
Lưu ý: Mã này phải được chạy trên Linux giống như sytems. Khi được thực thi trên windows có thể tạo ra các ngoại lệ.
Mục tiêu của Hệ điều hành -
Mục tiêu kép chính của OS là truyền bá công việc của quy trình một cách công bằng và đáp ứng cho người dùng. Chúng được thực hiện bằng cách theo dõi tất cả các quá trình đang chạy, cho mỗi quá trình một chút thời gian để chạy và sau đó chuyển sang một quá trình khác. Bạn có thể xem trạng thái của các quy trình của mình bằng giao diện đồ họa như Trình quản lý tác vụ trên máy tính chạy Windows, Trình theo dõi hoạt động của máy Mac (macOS) hoặc lệnh hàng đầu trong Linux.
Là một lập trình viên, chúng ta có thể truy cập dữ liệu quy trình từ chương trình của chính mình. Nhưng bằng cách nào? Đơn giản bằng cách sử dụng mô-đun hệ điều hành thư viện tiêu chuẩn. Tôi sẽ chỉ cho bạn một vài ví dụ.
# 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()}")
Việc chạy và tạo ra một quy trình hệ thống mới có thể khá hữu ích cho các nhà phát triển và quản trị viên hệ thống, những người muốn tự động hóa các tác vụ cụ thể của hệ điều hành.
Python có một mô-đun quy trình con, mô-đun này có thể quay một quy trình mới, gửi và nhận thông tin từ các quy trình, đồng thời xử lý các mã lỗi và trả về.
Tài liệu Python chính thức đề xuất mô-đun quy trình con để truy cập các lệnh hệ thống.
Hàm call () của quy trình con đợi lệnh được gọi kết thúc việc đọc đầu ra. Chúng ta sẽ xem một số ví dụ dưới đây để trích xuất thông tin về dung lượng ổ đĩa của hệ thống.
Đoạn mã dưới đây sẽ thực hiện lệnh df -h và nắm bắt thông tin. Sau đó, đầu ra được ghi lại vào khung dữ liệu gấu trúc để xử lý thêm.
Ví dụ
# 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)
Đầu ra
Đối tượng<_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...
Để có đầu ra chi tiết hơn với quy trình con, hãy xem mã bên dưới.
Ví dụ
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()
Đầu ra
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