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

เมื่อต้องการดูเฉพาะโปรเซสที่เกิดขึ้นจากการเรียกใช้ใน 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) คือ 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