Basic Process Mgmt. Commands
คำสั่งสำหรับการบริหารจัดการโปรเซส
ในการบริหารจัดการโปรเซสที่เกิดขึ้นในระหว่างเครื่องทำงานอยู่ จะเป็นหน้าที่หลักของระบบปฏิบัติการลีนุกซ์ ที่จะต้องจัดลำดับการร้องขอจากแต่ละโปรเซสเพื่อเข้าใช้ทรัพยากรของระบบ ดังนั้นโปรเซสทุกตัวจะต้องมีหมายเลขประจำของตัวเอง ซึ่งจะถูกกำหนดมาให้จากระบบปฏิบัติการเอง เรียกว่า PID (process id) แต่อย่างไรก็ตามผู้ใช้หรือนักพัฒนาก็สามารถควบคุมและบริหารจัดการกับโปรเซสที่เกิดจากการเรียกด้วยตัวผู้ใช้เอง โดยสามารถบริหารจัดการแยกเป็น กลุ่มได้แก่
การติดตามดูสถานะของโปรเซสโดยรวมด้วยคำสั่ง jobs
เลือกดูเฉพาะโปรเซสที่ต้องการ และค่าต่างที่ต้องการ
การส่งสัญญาณ (signals) แบบต่างไปยังโปรเซส
jobs, ps
คำสั่งที่เกี่ยวกับการติดตามดูสถานะของโปรเซสโดยรวมนั้น หลักมีอยู่ 2 คำสั่งคือ jobs และ ps (process snapshot) โดยคำสั่ง jobs นั้นจะแสดงหมายเลขของงานที่ถูกเรียกขึ้นมาตามลำดับ และมีหมายเลขโปรเซส (PID) อยู่ด้วย นอกจากนั้นคำสั่งนี้จะบอกสถานะของโปรเซสทั้งหมดว่าเป็นอย่างไรบ้าง เช่น กำลังทำงาน (running) ถูกหยุดการทำงาน (stopped) ถูกสั่งให้สิ้นสุดการทำงาน (killed) เป็นต้น ดังตัวอย่างคำสั่งข้างล่าง
$ jobs -l
[1] 11958 Running ./hello &
[2]- 12458 Stopped emulator & (wd: ~/aosp)
[3]+ 12794 Killed gcalctool
สำหรับคำสั่ง ps มีหน้าที่ในการแสดงรายละเอียดโปรเซส ตัวอย่างเช่น ถ้ารับรายการ PID มาจากคำสั่ง jobs ที่ระบุตัวเลือก -p (การลำดับ process group leader) ก็จะแสดงรายละเอียดของหมายเลขโปร เซสเหล่านั้น ดังตัวอย่างข้างล่าง
$ jobs -p
11958
12458
12818
ในกรณีที่ผู้ดูแลระบบต้องการทราบถึงสถานะโปรเซสทั้งหมดที่ทำงานอยู่ในระบบ ผู้ดูแลระบบจำเป็นต้องมีการเพิ่มตัวเลือก -ef ต่อท้ายคำสั่ง ps เพื่อแสดงผลโปรเซสทั้งหมดที่ทำงานอยู่ในระบบในขณะนั้น ดังตัวอย่างข้างล่าง
$ ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 Aug19 ? 00:00:01 /sbin/init
root 2 0 0 Aug19 ? 00:00:00 [kthreadd]
root 3 2 0 Aug19 ? 00:00:01 [migration/0]
root 4 2 0 Aug19 ? 00:00:08 [ksoftirqd/0]
root 5 2 0 Aug19 ? 00:00:00 [watchdog/0]
root 6 2 0 Aug19 ? 00:00:01 [migration/1]
root 7 2 0 Aug19 ? 00:00:08 [ksoftirqd/1]
root 8 2 0 Aug19 ? 00:00:00 [watchdog/1]
root 10 2 0 Aug19 ? 00:00:01 [events/1]
root 11 2 0 Aug19 ? 00:00:00 [cpuset]
root 12 2 0 Aug19 ? 00:00:00 [khelper]
root 13 2 0 Aug19 ? 00:00:00 [netns]
root 14 2 0 Aug19 ? 00:00:00 [async/mgr]
root 18 2 0 Aug19 ? 00:00:00 [bdi-default]
root 19 2 0 Aug19 ? 00:00:00 [kintegrityd/0]
root 20 2 0 Aug19 ? 00:00:00 [kintegrityd/1]
root 21 2 0 Aug19 ? 00:00:01 [kblockd/0]
root 306 2 0 Aug19 ? 00:00:05 [jbd2/sda1-8]
root 1268 1 0 Aug19 tty3 00:00:00 /sbin/getty -8 38400 tty3
root 1272 1 0 Aug19 tty6 00:00:00 /sbin/getty -8 38400 tty6
root 1275 1 0 Aug19 ? 00:00:07 /usr/sbin/irqbalance
student 11825 11824 0 05:21 ? 00:00:00 gnome-pty-helper
student 11826 11824 0 05:21 pts/0 00:00:00 bash
student 11958 11826 99 05:22 pts/0 01:24:29 ./hello
student 12458 11826 5 05:42 pts/0 00:03:43 /home/student/android/sdk/tools/
student 12515 1 0 05:43 pts/0 00:00:00 adb fork-server server
student 12818 11826 0 06:26 pts/0 00:00:00 gcalctool
root 12856 2 0 06:32 ? 00:00:00 [flush-8:0]
student 12929 11826 0 06:47 pts/0 00:00:00 ps -ef
จากผลลัพธ์ที่ได้จะสามารถทราบได้ว่ามีโปรเซสไหนบ้างที่เกิดจากการเรียกของผู้ใช้คนใด (UID) มีหมายเลขโปรเซส อะไร (PID) และเกิดขึ้นจากการเรียกของโปรเซสใด (PPID) เป็นต้น รายละเอียดดังอธิบายในตารางต่อไปนี้
UID
แสดง user เจ้าของโปรเซส
PID
แสดงหมายเลขโปรเซส (Process ID)
PPID
แสดงหมายเลขโปรเซสหลักที่ได้รับการสืบทอดมา (Parent Process ID)
C
แสดงการใช้งาน CPU
STIME
แสดงเวลาที่โปรเซสเริ่มต้น
TTY
แสดงรหัสเทอมินอลที่โปรเซสทำงานอยู่
TIME
เวลาโดยรวมที่เข้าไปใช้งาน CPU
CMD
ชื่อคำสั่งที่ใช้ในการสร้างโปรเซสขึ้นมา
เมื่อต้องการดูเฉพาะโปรเซสที่เกิดขึ้นจากการเรียกใช้ใน bash shell สามารถใช้ตัวเลือก เช่น -f (full), -j (jobs), -l (long), --forest, --sort ดังตัวอย่างการใช้งานข้างล่าง
$ ps
PID TTY TIME CMD
11826 pts/0 00:00:00 bash
11958 pts/0 01:19:16 hello
12458 pts/0 00:03:31 emulator64-x86
12515 pts/0 00:00:00 adb
12818 pts/0 00:00:00 gcalctool
12905 pts/0 00:00:00 ps
$ ps -f
UID PID PPID C STIME TTY TIME CMD
student 11826 11824 0 05:21 pts/0 00:00:00 bash
student 11958 11826 99 05:22 pts/0 01:19:17 ./hello
student 12458 11826 5 05:42 pts/0 00:03:31 /home/student/android/sdk/tools/
student 12515 1 0 05:43 pts/0 00:00:00 adb fork-server server
student 12818 11826 0 06:26 pts/0 00:00:00 gcalctool
student 12906 11826 0 06:42 pts/0 00:00:00 ps -f
$ ps -j --forest
PID PGID SID TTY TIME CMD
11826 11826 11826 pts/0 00:00:00 bash
11958 11958 11826 pts/0 01:19:31 \_ hello
12458 12458 11826 pts/0 00:03:31 \_ emulator64-x86
12818 12818 11826 pts/0 00:00:00 \_ gcalctool
12908 12908 11826 pts/0 00:00:00 \_ ps
12515 12514 11826 pts/0 00:00:00 adb
$ ps -aj --sort sid,comm
PID PGID SID TTY TIME CMD
12515 12514 11826 pts/0 00:00:00 adb
12458 12458 11826 pts/0 00:04:26 emulator64-x86
12818 12818 11826 pts/0 00:00:00 gcalctool
11958 11958 11826 pts/0 01:42:27 hello
13020 13020 11826 pts/0 00:00:00 ps
การหยุดการทำงานของโปรเซส (Process Killing) ในระบบปฏิบัติการลีนุกซ์นั้นจะใช้หลักการส่งข้อความของระบบในระดับล่าง (low-level system message) ที่เรียกกันว่า สัญญาณ (Signal) โดยสัญญาณจะถูกส่งไปขัดจังหวะโปรเซส เพื่อบอกกับโปรเซสตามวัตถุประสงค์ของสัญญาณนั้น ซึ่งในระบบปฏิบัติิการลีนุกซ์จะมีชนิดของสัญญาณอยู่ทั้งสิ้น 64 ชนิด สามารถดูรายละเอียดได้จากการพิมพ์คำสั่ง kill -l ดังข้างล่างนี้
$ kill -l
1) SIGHUP
2) SIGINT
3) SIGQUIT
4) SIGILL
5) SIGTRAP
6) SIGABRT
7) SIGBUS
8) SIGFPE
9) SIGKILL
10) SIGUSR1
11) SIGSEGV
12) SIGUSR2
13) SIGPIPE
14) SIGALRM
15) SIGTERM
16) SIGSTKFLT
17) SIGCHLD
18) SIGCONT
19) SIGSTOP
20) SIGTSTP
21) SIGTTIN
22) SIGTTOU
23) SIGCONT
24) SIGXCPU
25) SIGXFSZ
26) SIGVTALRM
27) SIGPROF
28) SIGWINCH
29) SIGIO
30) SIGPWR
31) SIGSYS
34) SIGRTMIN
35) SIGRTMIN+1
36) SIGRTMIN+2
37) SIGRTMIN+3
38) SIGRTMIN+4
39) SIGRTMIN+5
40) SIGRTMIN+6
41) SIGRTMIN+7
42) SIGRTMIN+8
43) SIGRTMIN+9
44) SIGRTMIN+10
45) SIGRTMIN+11
46) SIGRTMIN+12
47) SIGRTMIN+13
48) SIGRTMIN+14
49) SIGRTMIN+15
50) SIGRTMAX-14
51) SIGRTMAX-13
52) SIGRTMAX-12
53) SIGRTMAX-11
54) SIGRTMAX-10
55) SIGRTMAX-9
56) SIGRTMAX-8
57) SIGRTMAX-7
58) SIGRTMAX-6
59) SIGRTMAX-5
60) SIGRTMAX-4
61) SIGRTMAX-3
62) SIGRTMAX-2
63) SIGRTMAX-1
64) SIGRTMAX
ตัวอย่างสัญญาณที่สำคัญและใช้งานบ่อย ตัวอย่างเช่น
สัญญาณหมายเลข 1 (SIGHUP) คือ Hang Up Signal เป็นสัญญาณที่ถูกส่งออกไปในขณะที่ terminal ถูกปิดลงเพื่อทำให้โปรเซสที่ถูกเรียกภายใต้ terminal ถูกปิดลงตามด้วย
สัญญาณหมายเลข 3 (SIGQUIT) คือ Quit Signal เป็นสัญญาณที่ถูกส่งออก ในขณะที่ผู้ใช้งานได้มีการสั่งให้ โปรเซสนั้นปิดตัวลง
สัญญาณหมายเลข 6 (SIGABRT) คือ Abort Signal เป็นสัญญาณที่ถูกส่งออกมาจากโปรเซสที่ต้องการปิดตัวเองลง
สัญญาณหมายเลข 9 (SIGKILL) คือ Kill Signal ลักษณะชอง signal ประเภทนี้จะคล้ายกับการดึงสายไฟออกจากเครื่องคอมพิวเตอร์ กล่าวคือเป็นการสั่งให้โปรเซสปิดตัวลงทันทีไม่ว่าจะทำงานอะไรอยู่ก็ตาม
สัญญาณหมายเลข 18 (SIGCONT) คือ Continue Signal เป็นสัญญาณที่สั่งให้โปรเซสนั้นกลับมาทำงานปกติเช่นเดิม เช่นเดียวกันการสั่งให้โปรเซสกลับมาทำงานเบื้องหน้า (foreground)
สัญญาณหมายเลข 20 (SIGTSTP) คือ การส่ง Stop Signal ด้วย Keyboard (Ctrl+Z) เป็นสัญญาณที่สั่งให้โปรเซสนั้นถูกทำให้ไปทำงานเบื้องหลัง (background) เช่นเดียวกับการกดปุ่ม Ctrl+Z บนคีย์บอร์ด
ตัวอย่างการส่งสัญญาณผ่านคีย์บอร์ด
เป็นวิธีการหนึ่งของการส่งสัญญาณให้กับโปรเซส โดยเมื่อมีกดคำสั่งบนคีย์บอร์ดดังนี้
Ctrl-C
ส่งสัญญาณ INT (SIGINT) ไปยังโปรเซสที่ทำงานอยู่ยุติการทำงานทันที
Ctrl-Z
ส่งสัญญาณ TSTP (SIGTSTP) ไปยังโปรเซสที่ทำงานอยู่ให้หยุดชั่วคราว
Ctrl-\
ส่งสัญญาณ ABRT (SIGABRT) ไปยังโปรเซสที่ทำงานอยู่ให้ยุติการทำงานของโปรเซสนั้นทันที เหมือน Ctrl-C แต่เป็นคำสั่งที่ดีกว่าคือสามารถแก้ไขได้
$ jobs -l
[1] 11958 Running ./hello &
[2]- 12458 Running emulator & (wd: ~/aosp)
[3]+ 12818 Running gcalctool &
$ kill -s SIGTSTP 12818
$ jobs -l
[1] 11958 Running ./hello &
[2]- 12458 Running emulator & (wd: ~/aosp)
[3]+ 12818 Stopped gcalctool
$ kill -s SIGCONT 12818
$ jobs -l
[1] 11958 Running ./hello &
[2]- 12458 Running emulator & (wd: ~/aosp)
[3]+ 12818 Running gcalctool &
$ kill -s SIGKILL 12818
$ jobs -l
[1] 11958 Running ./hello &
[2]- 12458 Running emulator & (wd: ~/aosp)
[3]+ 12818 Killed gcalctool
$ kill -s SIGTERM 11958
$ jobs -l
[1] 11958 Terminated ./hello
[2]- 12458 Running emulator & (wd: ~/aosp)
Last updated
Was this helpful?