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) เป็นต้น รายละเอียดดังอธิบายในตารางต่อไปนี้

ตารางแสดงรายละเอียดของคำสั่ง ps

คอลัมน์
ความหมาย

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

Assoc. Prof. Wiroon Sriborrirux, Founder of Advance Innovation Center (AIC) and Bangsaen Design House (BDH), Electrical Engineering Department, Faculty of Engineering, Burapha University