![]() |
![]() |
![]() |
![]() |
![]() |
$ dd if=/dev/zero of=1g-file bs=1G count=1; seq 1 1000000 |
$ seq 1 1000000 1 2 3 4 Ctrl+C ←按 <Ctrl+C>終止前景程式 $ |
$ seq 1 1000000 1 2 3 4 Ctrl+Z ←按 <Ctrl+Z>暫停前景程式 [1]+ Stopped seq 1 100000000 ←程式被 stoped 了 $ mv fileA fileB ←(插隊的指令) $ fg ←繼續剛暫停 job 5 6 7 以下略 |
$ dd if=/dev/zero of=1g-file bs=1G count=1 & ←將 dd 放到背景 [1] 2680 ←中括號內的數字(〝[1]〞)為 job number $ seq 1 1000000 ←前景可跑其他指令 1 2 3 以下略 |
$ dd if=/dev/zero of=1g-image bs=1G count=1 & ←產生 1G 大小的檔案並放到背景 [1] 2680 ←job number 為〝1〞pid number 為〝2680〞 $ sleep 60 & ←整個 shell 暫停 60 秒並丟到背景 [2] 2681 ←job number 為〝2〞pid number 為〝2681〞 $ su ←切換為 superuser # updatedb & ←以 superuser 在背景跑〝updatedb〞 [1] 2725 ←job number 為〝1〞 (但此為 superuser 的 job number) |
$ dd if=/dev/zero of=1g-image bs=1G count=1 & sleep 60 & ↵ Enter←將多個指令放到背景 [1] 2680 [2] 2681 |
$ seq 1 10000 > count.txt & ←將背景程式的 stdout 重定向檔案 [1] 2680 $ cp -r /etc /tmp 1> /dev/null 2>&1 & ←將背景程式的 stdout 和 stderr 重定向到檔案 [2] 2681 |
$ sleep 600 & [1] 2680 $ dd if=/dev/zero of=1g-file bs=1G count=1& [2] 2681 $ seq 1 1000000 1 2 3 Ctrl+Z ←按 <Ctrl+Z>暫停指令〝seq 1 1000000〞 [3]+ Stopped seq 1 100000000 $ jobs ←顯示在背景的指令 [1] Running sleep 600 & ←〝[ ]〞內的數字為 job number [2]- dd if=/dev/zero of=1g-file bs=1G count=1 & ←倒數第二個 job number 會顯示〝-〞 [3]+ Stopped seq 1 1000000 ←最後一個 job number 會顯示〝+〞 |
符號 | 說明 |
〝%+〞 或〝+〞 或〝 %%〞 | 最後一個 job |
〝%- 〞或 〝-〞 | 倒數第二個 job |
〝%#〞(#為 job number 的數字) | 指定的 job number |
〝%CMD〞(CMD 為指令名稱) | 指定名稱的 jobs |
〝%?STRING〞(STRING 為字串) | 指定指令包含的字串 |
$ fg %- ←將倒數第二個 job 轉為前景 $ fg %4 ←將 job number=4 的程式轉為前景 $ kill %cp ←將〝cp〞開頭的 job 指令終止(可為 cpp 或 cp 等〝cp〞開頭的指令 ) $ bg %?100 ←將 jobs 中有〝100〞字串的指令放到背景繼續執行(如 sleep 10000) $ jobs -s -l ←列出暫停的 jobs 並列出 PID |
$ seq 1 1000000 1 2 3 CTRL+Z ←按 <CTRLl+Z>暫停前景程式 [1]+ Stopped seq 1 100000000 ←暫停目前的程式 $ bg ←繼續被暫停的程式但於到背景去執行 4 5 以下略 |
$ bg %3 ←將 job number=3 轉為在背景下繼續跑 |
$ seq 1 1000000 1 2 3 CTRL+Z ←按 <CTRLl+Z>暫停前景程式 [1]+ Stopped seq 1 100000000 ←暫停目前的程式 $ fg ←繼續被暫停的程式並轉為前景執行 5 6 以下略 $ fg + ←將最後一 job 轉為前景 $ fg ←同上 $ fg %5 ←將 job number=5 的指令轉為前景 $ fg %gzip ←將 gzip 指令轉為前景 |
$ kill -l ←列出所有的 signal 編號 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) SIGURG 24) SIGXCPU 以下略 |
$ seq 1000000000 > /dev/null & ←產生一背景進程 [1] 21533 $ kill -s SIGINT %+1 ← 送一〝SIGINT〞到背景進程(kill -s SIGINT 同指令 kill -2) [1]+ Interrupt seq 1000000000 > /dev/null ←背景進程被中斷了 $ seq 1 1000000 ←輸出 1 ~ 1000000 1 2 3 CTRL+Z ←按 <CTRLl+Z>暫停程式 $ kill -s SIGCONT %+1 ← 送一〝SIGCONT〞(繼續)到暫停的程式 4 ←輸出繼續了 5 6 以下略 |
$ kill -s SIGKILL %2 ←殺死 job number=2 的 job $ kill -9 1234 ←殺死 PID =2 的 process |
值 | SIGNAL 名稱 | 說明 |
2 | SIGINT | 終止程式,相當於鍵盤按 <CTRL-C>所以 CTRL-C 可中斷的指令皆可用此 Signal 來終止 |
3 | SIGQUIT | 相當於鍵盤按 <CTRL-\> 來終止程式 |
9 | SIGKILL | 暴力終止 process |
15 | SIGTERM | 此為預設值,process 收到此 Signal 時大多會儲存必要的資料後被關掉,系統關機也是預設先用此值來關閉 process,不成功才會用到 (9)SIGKILL |
17 | SIGCHLD | 通知父進程子進程已往生,不用再餵三餐有事燒香 |
18 | SIGCONT | 繼續被 Signal (19)SIGSTOP 或 (2)SIGTSTP 暫停的動作 |
19 | SIGSTOP | 暫時暫停,後續可用 Signal (18)SIGCONT 來恢復,和 (20)SIGTSTP 明顯不同為此 Signal 不可忽略 |
20 | SIGTSTP | 相當於鍵盤按 <CTRL-Z>但和 (19)SIGSTOP 比較明顯不一樣的地方為有些 process 可忽略此 Singal |
$ kill -9 %3 ←暴力終止 jobs #3 $ kill -s SIGSTOP 1234 ←暫停 PID=1234 的 process $ kill -s SIGCONT 1234 ←恢復 PID=1234 的 process $ kill %gzip ←殺死 gzip 這個 job |
以下製造不同的 process $ dd if=/dev/zero of=1g-file bs=1G count=1 & [1] 2890 $ sleep 1000& [2] 2891 $ sleep 2000& [3] 2892 $ sleep 3000& [4] 2895 $ jobs ←查看剛產生的 process [1] Running dd if=/dev/zero of=1g-file bs=1G count=1 & [2] Running sleep 1000 & [3]- Running sleep 2000 & [4]+ Running sleep 3000 & $ killall sleep ←把姓〝sleep〞 的 process 全部抄家,其他留活口 [2] Terminated sleep 1000 [3]- Terminated sleep 2000 [4]+ Terminated sleep 3000 $ jobs ←驗證看看 [1]+ Running dd if=/dev/zero of=1g-file bs=1G count=1 & |
$ echo $$ ←顯示目前 shell 的 PID 2592 $ echo $PPID ←顯示 shell 的 PPID 2588 |
$ tar -Jcvf file.txz /etc &> /dev/null & ← 在背景執行 tar 打包完再用 xz 壓縮 [1]14855 $ pstree -ps 14855 ←觀察 process 父子關係和其 PID systemd(1)───gnome-terminal-(14248)───bash(14257)───tar(14855)───xz(14859) |
$ seq 0 100000000 | grep '[[:digit:]]' | tr '0-9' 'A-J' > /dev/null & [1] 29868 $ ps -o pid,pgid,comm ←觀察 pid & pgid PID PGID COMMAND 2564 2564 bash 29866 29866 seq 29867 29866 grep 29868 29866 tr 29874 29874 ps $ kill -SIGTERM -29866 ←29866 前那個〝-〞表示對象是〝pgid〞 |
$ sleep 1000 & [1] 2847 $ seq 0 100000000 | tr '0-9' 'A-J' > /dev/null & [2] 2849 $ ps -o pid,sid,comm ←觀察 pid & sid(如不登出其 SID 應都一樣) PID SID COMMAND 2711 2711 bash 2847 2711 sleep 2848 2711 seq 2849 2711 tr 2850 2711 ps |
$ echo $$ ←例出目前 sehll 的 PID 2563 $ bash ←執行另一個 shell $ echo $$ $PPID ←例出目前 sehll 的 PID 和 PPID 2592 2563 ←目前的 PPID =〝2563〞是上個 shell 的 PID |
$ echo $$ $PPID ←查看目前 shell 的 PID 和 PPID 2592 2563 $ chsh -l ←查看有那些 shell 可用 /bin/csh /bin/sh /bin/bash /sbin/nologin $ exec csh ←用〝exec〞讓新的 csh 取代完 shell (用指令〝exit〞不會回到原 shell) % echo $$ $PPID ←查看目前 shell 的 PID 和 PPID 2592 2563 |
語法:ps [option][-option] | |||
指令名稱/功能/命令使用者 | 選項 | 功能 | |
ps/ (process status)顯示進程狀況/ Any |
-a | 列出所有 tty 但排除 session leader 和終端機的 process | |
a | 列出所有 tty (終端機) 的 jobs,和選項〝x〞一起使用會列出所有 process (包含daemon) | ||
-A | 列出所有 process,類似 ps ax 但沒 〝STAT〞欄 | ||
-f | 類似選項〝-a〞但多了〝UID〞,〝STIME〞等欄位 | ||
f | 類似 pstree 但只顯示登入者同一 session id 的 process | ||
o FORMAT | 指定要顯示的欄位,常用的有〝pid〞、〝ppid〞、〝pgid〞、〝sid〞、〝tty〞、〝time〞 、〝nice〞、〝comm〞等 | ||
-t [N] | 指定 tty (〝N〞為數字)的 process | ||
-u [USER] | 指定使用者的 process | ||
-x | 類似選項〝a〞但只顯示使有者 tty 的 process,時常和選項〝a〞一起使用會列出所有 process |
$ ps PID TTY TIME CMD 3627 pts/0 00:00:00 bash 3656 pts/0 00:00:00 vim 3657 pts/0 00:00:00 ps |
$ ps aux | grep 'Z' USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND chi 3458 0.0 0.0 0 0 ? Z 00:46 0:00 [xinitrc] <defunct> chi 3459 0.0 0.0 0 0 ? Z 00:46 0:00 [xinitrc] <defunct> chi 3691 0.0 0.0 0 0 pts/0 Z 00:59 0:00 [myprog] <defunct> |
$ ps -o pid,ppid,pgid,nice,tty,comm PID PPID PGID NI TT COMMAND 3627 3624 3627 0 pts/0 bash 3656 3627 3656 0 pts/0 vim 3727 3627 3727 0 pts/0 ps |
$ ps -t 1 ←顯示 tty1 的 process $ ps f -u obama ←顯示使用者〝obama〞 的 process tree |
$ top top - 00:42:30 up 36 days, 1:08, 2 users, load average: 0.16, 0.02, 0.01 Tasks: 130 total, 4 running, 125 sleeping, 1 stopped, 0 zombie Cpu(s): 0.2%us, 2.6%sy, 0.0%ni, 97.2%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 515156k total, 438756k used, 76400k free, 11520k buffers Swap: 1020088k total, 0k used, 1020088k free, 253064k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 2295 root 20 0 32496 12m 5936 S 1.2 2.4 0:15.29 X 2571 aaa 20 0 64484 19m 10m S 0.9 3.9 0:04.20 gnome-terminal 2113 root 20 0 3388 1148 1012 S 0.2 0.2 0:00.20 hald-addon-inpu 2414 aaa 20 0 31500 3616 2940 S 0.2 0.7 0:01.01 exe 以下略 |
sy | 系統佔 CPU 的時間(system cpu time) |
ni | renice process 佔的 CPU 時間(user nice cpu time) |
id | 系統閒置時間(idle cpu time) |
wa | 系統等待IO(輸出/輸入周邊)的時間(io wait cpu time) |
hi | 系統花在硬體中斷時間(hardware irq) |
si | 系統花在軟體中斷的時間(software irq) |
st | 系統花在虛擬機的時間(steal time % CPU time in involuntary wait by virtual cpu while hypervisor is servicing) |
PID | process 的 PID |
USER | process 的使用者 |
PR | process 的優先順序(priority) |
NI | process 的 nice 值(niceness value) |
VIRT | 〝VIER〞為 virtual image run time 的縮寫,為 process 使用 swap memory 情形(kb) |
RES | 〝RES〞為 resident size 的縮寫,為 process 使用的 memory 狀況(kb) |
SHR | 共用記憶體大小(shared memory size)(kb) |
S | 〝S〞為 status,即 process 狀態,可能有如下的狀態 D=不可中斷的 sleeping process R=正在運行的 process S=sleeping process T=暫停的 process Z=zombie process |
%CPU | process 的 CPU 使用率 |
%MEM | process 的 memory 使用率 |
TIME+ | process 使用CPU 的時間總計,單位為 1/100 秒 |
COMMAND | process 名稱 |
$ top -p 61,162 ←只例出 PID=61 & 162 的 process |
$ top -b -o +%CPU | head ←例出前 3 個最佔 CPU 資源的進程 $ top -b -o +%MEM | head 17 > file ←例出前 10 個最佔 memory 資源的進程存入〝file〞 |
$ nice ←顯示目前的優先權值 0 ←目前=0 $ sleep 1000 & ←製造一背景 process 觀察其優先權值 [1] 2733 $ ps -o pid,ni,comm ←用 ps 察看 nice 值 PID NI COMMAND ←〝NI〞為 nice 優先權值 2578 0 bash 2632 0 sleep 2634 0 ps |
$ seq 90000000000 > /dev/null & ← 在背景跑二個默數恆河沙數的進程 $ seq 90000000000 > /dev/null & $ time tar -Jcvf file.txz /etc &> /dev/null ← 在背景執行打包 tarball 並測量執行時間 real 0m27.590s ← 花了 27.59 秒 user 0m21.163s sys 0m0.187s $ time nice -n 5 tar -Jcvf file.txz /etc &> /dev/null ←將 nice 調成 5 再測一下所執行時間 real 1m24.405s ← 花了 1 分 24 秒 user 0m21.529s sys 0m0.211s |
$ renice 6 -p 2632 ←將 PID=2632 niceness 改為 6 2632: old priority 0, new priority 6 |
$ dd if=/dev/zero of=/dev/null bs=1 count=100G & [1] 2915 $ seq 0 9999999999 > /dev/null & [2] 2926 $ yes > /dev/null & [3] 2929 |
$ top -p 2915,2926,2929 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 2915 aaa 20 0 3956 552 472 R 33.0 0.1 2:34.52 dd if /dev/zero of 2929 aaa 20 0 3796 456 400 R 33.0 0.1 1:18.53 yes 2926 aaa 20 0 3800 548 488 R 32.6 0.1 1:33.64 seq 0 9999999999 |
$ renice 15 2915 2915: old priority 0, new priority 15 $ top -p 2915,2926,2929 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 2926 aaa 20 0 3800 548 488 R 45.3 0.1 12:16.22 seq 0 9999999999 2929 aaa 20 0 3796 456 400 R 45.3 0.1 12:01.15 yes 2915 aaa 35 15 3956 552 472 R 1.7 0.1 8:07.17 dd if /dev/zero of |
$ mkfifo MyPipe ←製作一 named pipe 資料形態檔〝MyPipe〞 $ ls -l MyPipe ←用 ls 驗證看看 prw-rw-r-- 1 aaa aaa 0 2015-03-20 15:23 MyPipe ←最前面那個〝p〞就是 named pipe $ file MyPipe ←用 file 驗證看看 MyPipe: fifo (named pipe) |
$ tr '0-9' 'a-j' < MyPipe > out.txt & [1] 3031 $ seq 0 10 > MyPipe [1]+ Done tr '0-9' 'a-j' < MyPipe > out.txt $ cat out.txt ←驗證看輸出檔〝out.txt〞是否已轉為字母 a b c d e 以下略 |
$ bzip2 -c < MyPipe > out.bz2 & [1] 3088 $ seq 1 1000 > MyPipe $ bzcat out.bz2 ←讀取壓縮檔驗證看看 1 2 3 以下略 |
$ rm MyPipe |
$ mkfifo --mode=0666 /tmp/name_pipe |
$ diff <(tr a-z A-Z < file1) <(tr a-z A-Z < file2) ←比較〝file1〞&〝file2〞這二個檔案的異同&不管大小寫 |
$ cat file1 | tr a-z A-Z > file1.tmp $ cat file2 | tr a-z A-Z | diff - file1.tmp $ rm file1.tmp |
$ ls -gGl <(echo) lr-x------ 1 64 2015-04-10 22:54 /dev/fd/63 -> pipe:[15358] $ file <(true) /dev/fd/63: broken symbolic link to `pipe:[15478]' |
$ diff file1 <(uniq file2) |