1. 段錯(cuò)誤是什么
創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、蒙城網(wǎng)絡(luò)推廣、小程序開發(fā)、蒙城網(wǎng)絡(luò)營銷、蒙城企業(yè)策劃、蒙城品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供蒙城建站搭建服務(wù),24小時(shí)服務(wù)熱線:18982081108,官方網(wǎng)址:www.cdcxhl.com
一句話來說,段錯(cuò)誤是指訪問的內(nèi)存超出了系統(tǒng)給這個(gè)程序所設(shè)定的內(nèi)存空間,例如訪問了不存在的內(nèi)存地址、訪問了系統(tǒng)保護(hù)的內(nèi)存地址、訪問了只讀的內(nèi)存地址等等情況。這里貼一個(gè)對(duì)于“段錯(cuò)誤”的準(zhǔn)確定義(參考Answers.com):
A segmentation fault (often shortened to segfault) is a particular error condition that can occur during the operation of computer software. In short, a segmentation fault occurs when a program attempts to access a memory location that it is not allowed to access, or attempts to access a memory location in a way that is not allowed (e.g., attempts to write to a read-only location, or to overwrite part of the operating system). Systems based on processors like the Motorola 68000 tend to refer to these events as Address or Bus errors.
Segmentation is one approach to memory management and protection in the operating system. It has been superseded by paging for most purposes, but much of the terminology of segmentation is still used, "segmentation fault" being an example. Some operating systems still have segmentation at some logical level although paging is used as the main memory management policy.
On Unix-like operating systems, a process that accesses invalid memory receives the SIGSEGV signal. On Microsoft Windows, a process that accesses invalid memory receives the STATUS_ACCESS_VIOLATION exception.
2. 段錯(cuò)誤產(chǎn)生的原因
2.1 訪問不存在的內(nèi)存地址
#includestdio.h
#includestdlib.h
void main()
{
int *ptr = NULL;
*ptr = 0;
}
2.2 訪問系統(tǒng)保護(hù)的內(nèi)存地址
#includestdio.h
#includestdlib.h
void main()
{
int *ptr = (int *)0;
*ptr = 100;
}
2.3 訪問只讀的內(nèi)存地址
#includestdio.h
#includestdlib.h
#includestring.h
void main()
{
char *ptr = "test";
strcpy(ptr, "TEST");
}
2.4 棧溢出
#includestdio.h
#includestdlib.h
void main()
{
main();
}
等等其他原因。
3. 段錯(cuò)誤信息的獲取
程序發(fā)生段錯(cuò)誤時(shí),提示信息很少,下面有幾種查看段錯(cuò)誤的發(fā)生信息的途徑。
3.1 dmesg
dmesg可以在應(yīng)用程序crash掉時(shí),顯示內(nèi)核中保存的相關(guān)信息。如下所示,通過dmesg命令可以查看發(fā)生段錯(cuò)誤的程序名稱、引起段錯(cuò)誤發(fā)生的內(nèi)存地址、指令指針地址、堆棧指針地址、錯(cuò)誤代碼、錯(cuò)誤原因等。以程序2.3為例:
panfeng@ubuntu:~/segfault$ dmesg
[ 2329.479037] segfault3[2700]: segfault at 80484e0 ip 00d2906a sp bfbbec3c error 7 in libc-2.10.1.so[cb4000+13e000]
3.2 -g
使用gcc編譯程序的源碼時(shí),加上-g參數(shù),這樣可以使得生成的二進(jìn)制文件中加入可以用于gdb調(diào)試的有用信息。以程序2.3為例:
panfeng@ubuntu:~/segfault$ gcc -g -o segfault3 segfault3.c
3.3 nm
使用nm命令列出二進(jìn)制文件中的符號(hào)表,包括符號(hào)地址、符號(hào)類型、符號(hào)名等,這樣可以幫助定位在哪里發(fā)生了段錯(cuò)誤。以程序2.3為例:
panfeng@ubuntu:~/segfault$ nm segfault3
08049f20 d _DYNAMIC
08049ff4 d _GLOBAL_OFFSET_TABLE_
080484dc R _IO_stdin_used
w _Jv_RegisterClasses
08049f10 d __CTOR_END__
08049f0c d __CTOR_LIST__
08049f18 D __DTOR_END__
08049f14 d __DTOR_LIST__
080484ec r __FRAME_END__
08049f1c d __JCR_END__
08049f1c d __JCR_LIST__
0804a014 A __bss_start
0804a00c D __data_start
08048490 t __do_global_ctors_aux
08048360 t __do_global_dtors_aux
0804a010 D __dso_handle
w __gmon_start__
0804848a T __i686.get_pc_thunk.bx
08049f0c d __init_array_end
08049f0c d __init_array_start
08048420 T __libc_csu_fini
08048430 T __libc_csu_init
U __libc_start_main@@GLIBC_2.0
0804a014 A _edata
0804a01c A _end
080484bc T _fini
080484d8 R _fp_hw
080482bc T _init
08048330 T _start
0804a014 b completed.6990
0804a00c W data_start
0804a018 b dtor_idx.6992
080483c0 t frame_dummy
080483e4 T main
U memcpy@@GLIBC_2.0
3.4 ldd
使用ldd命令查看二進(jìn)制程序的共享鏈接庫依賴,包括庫的名稱、起始地址,這樣可以確定段錯(cuò)誤到底是發(fā)生在了自己的程序中還是依賴的共享庫中。以程序2.3為例:
panfeng@ubuntu:~/segfault$ ldd ./segfault3
linux-gate.so.1 = (0x00e08000)
libc.so.6 = /lib/tls/i686/cmov/libc.so.6 (0x00675000)
/lib/ld-linux.so.2 (0x00482000)
4. 段錯(cuò)誤的調(diào)試方法
4.1 使用printf輸出信息
這個(gè)是看似最簡(jiǎn)單但往往很多情況下十分有效的調(diào)試方式,也許可以說是程序員用的最多的調(diào)試方式。簡(jiǎn)單來說,就是在程序的重要代碼附近加上像printf這類輸出信息,這樣可以跟蹤并打印出段錯(cuò)誤在代碼中可能出現(xiàn)的位置。
為了方便使用這種方法,可以使用條件編譯指令#ifdef DEBUG和#endif把printf函數(shù)包起來。這樣在程序編譯時(shí),如果加上-DDEBUG參數(shù)就能查看調(diào)試信息;否則不加該參數(shù)就不會(huì)顯示調(diào)試信息。
4.2 使用gcc和gdb
4.2.1 調(diào)試步驟
1、為了能夠使用gdb調(diào)試程序,在編譯階段加上-g參數(shù),以程序2.3為例:
panfeng@ubuntu:~/segfault$ gcc -g -o segfault3 segfault3.c
2、使用gdb命令調(diào)試程序:
panfeng@ubuntu:~/segfault$ gdb ./segfault3
GNU gdb (GDB) 7.0-ubuntu
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later ;
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "i486-linux-gnu".
For bug reporting instructions, please see:
;...
Reading symbols from /home/panfeng/segfault/segfault3...done.
(gdb)
3、進(jìn)入gdb后,運(yùn)行程序:
(gdb) run
Starting program: /home/panfeng/segfault/segfault3
Program received signal SIGSEGV, Segmentation fault.
0x001a306a in memcpy () from /lib/tls/i686/cmov/libc.so.6
(gdb)
從輸出看出,程序2.3收到SIGSEGV信號(hào),觸發(fā)段錯(cuò)誤,并提示地址0x001a306a、調(diào)用memcpy報(bào)的錯(cuò),位于/lib/tls/i686/cmov/libc.so.6庫中。
4、完成調(diào)試后,輸入quit命令退出gdb:
(gdb) quit
A debugging session is active.
Inferior 1 [process 3207] will be killed.
Quit anyway? (y or n) y
4.2.2 適用場(chǎng)景
1、僅當(dāng)能確定程序一定會(huì)發(fā)生段錯(cuò)誤的情況下使用。
2、當(dāng)程序的源碼可以獲得的情況下,使用-g參數(shù)編譯程序。
3、一般用于測(cè)試階段,生產(chǎn)環(huán)境下gdb會(huì)有副作用:使程序運(yùn)行減慢,運(yùn)行不夠穩(wěn)定,等等。
4、即使在測(cè)試階段,如果程序過于復(fù)雜,gdb也不能處理。
4.3 使用core文件和gdb
在4.2節(jié)中提到段錯(cuò)誤會(huì)觸發(fā)SIGSEGV信號(hào),通過man 7 signal,可以看到SIGSEGV默認(rèn)的handler會(huì)打印段錯(cuò)誤出錯(cuò)信息,并產(chǎn)生core文件,由此我們可以借助于程序異常退出時(shí)生成的core文件中的調(diào)試信息,使用gdb工具來調(diào)試程序中的段錯(cuò)誤。
4.3.1 調(diào)試步驟
1、在一些Linux版本下,默認(rèn)是不產(chǎn)生core文件的,首先可以查看一下系統(tǒng)core文件的大小限制:
panfeng@ubuntu:~/segfault$ ulimit -c
2、可以看到默認(rèn)設(shè)置情況下,本機(jī)Linux環(huán)境下發(fā)生段錯(cuò)誤時(shí)不會(huì)自動(dòng)生成core文件,下面設(shè)置下core文件的大小限制(單位為KB):
panfeng@ubuntu:~/segfault$ ulimit -c 1024
panfeng@ubuntu:~/segfault$ ulimit -c
1024
3、運(yùn)行程序2.3,發(fā)生段錯(cuò)誤生成core文件:
panfeng@ubuntu:~/segfault$ ./segfault3
段錯(cuò)誤 (core dumped)
4、加載core文件,使用gdb工具進(jìn)行調(diào)試:
panfeng@ubuntu:~/segfault$ gdb ./segfault3 ./core
GNU gdb (GDB) 7.0-ubuntu
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later ;
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "i486-linux-gnu".
For bug reporting instructions, please see:
;...
Reading symbols from /home/panfeng/segfault/segfault3...done.
warning: Can't read pathname for load map: 輸入/輸出錯(cuò)誤.
Reading symbols from /lib/tls/i686/cmov/libc.so.6...(no debugging symbols found)...done.
Loaded symbols for /lib/tls/i686/cmov/libc.so.6
Reading symbols from /lib/ld-linux.so.2...(no debugging symbols found)...done.
Loaded symbols for /lib/ld-linux.so.2
Core was generated by `./segfault3'.
Program terminated with signal 11, Segmentation fault.
#0 0x0018506a in memcpy () from /lib/tls/i686/cmov/libc.6
從輸出看出,同4.2.1中一樣的段錯(cuò)誤信息。
5、完成調(diào)試后,輸入quit命令退出gdb:
(gdb) quit
4.3.2 適用場(chǎng)景
1、適合于在實(shí)際生成環(huán)境下調(diào)試程序的段錯(cuò)誤(即在不用重新發(fā)生段錯(cuò)誤的情況下重現(xiàn)段錯(cuò)誤)。
2、當(dāng)程序很復(fù)雜,core文件相當(dāng)大時(shí),該方法不可用。
4.4 使用objdump
4.4.1 調(diào)試步驟
1、使用dmesg命令,找到最近發(fā)生的段錯(cuò)誤輸出信息:
panfeng@ubuntu:~/segfault$ dmesg
... ...
[17257.502808] segfault3[3320]: segfault at 80484e0 ip 0018506a sp bfc1cd6c error 7 in libc-2.10.1.so[110000+13e000]
其中,對(duì)我們接下來的調(diào)試過程有用的是發(fā)生段錯(cuò)誤的地址:80484e0和指令指針地址:0018506a。
2、使用objdump生成二進(jìn)制的相關(guān)信息,重定向到文件中:
panfeng@ubuntu:~/segfault$ objdump -d ./segfault3 segfault3Dump
其中,生成的segfault3Dump文件中包含了二進(jìn)制文件的segfault3的匯編代碼。
3、在segfault3Dump文件中查找發(fā)生段錯(cuò)誤的地址:
panfeng@ubuntu:~/segfault$ grep -n -A 10 -B 10 "80484e0" ./segfault3Dump
121- 80483df: ff d0 call *%eax
122- 80483e1: c9 leave
123- 80483e2: c3 ret
124- 80483e3: 90 nop
125-
126-080483e4 main:
127- 80483e4: 55 push %ebp
128- 80483e5: 89 e5 mov %esp,%ebp
129- 80483e7: 83 e4 f0 and $0xfffffff0,%esp
130- 80483ea: 83 ec 20 sub $0x20,%esp
131: 80483ed: c7 44 24 1c e0 84 04 movl $0x80484e0,0x1c(%esp)
132- 80483f4: 08
133- 80483f5: b8 e5 84 04 08 mov $0x80484e5,%eax
134- 80483fa: c7 44 24 08 05 00 00 movl $0x5,0x8(%esp)
135- 8048401: 00
136- 8048402: 89 44 24 04 mov %eax,0x4(%esp)
137- 8048406: 8b 44 24 1c mov 0x1c(%esp),%eax
138- 804840a: 89 04 24 mov %eax,(%esp)
139- 804840d: e8 0a ff ff ff call 804831c memcpy@plt
140- 8048412: c9 leave
141- 8048413: c3 ret
通過對(duì)以上匯編代碼分析,得知段錯(cuò)誤發(fā)生main函數(shù),對(duì)應(yīng)的匯編指令是movl $0x80484e0,0x1c(%esp),接下來打開程序的源碼,找到匯編指令對(duì)應(yīng)的源碼,也就定位到段錯(cuò)誤了。
4.4.2 適用場(chǎng)景
1、不需要-g參數(shù)編譯,不需要借助于core文件,但需要有一定的匯編語言基礎(chǔ)。
2、如果使用了gcc編譯優(yōu)化參數(shù)(-O1,-O2,-O3)的話,生成的匯編指令將會(huì)被優(yōu)化,使得調(diào)試過程有些難度。
4.5 使用catchsegv
catchsegv命令專門用來撲獲段錯(cuò)誤,它通過動(dòng)態(tài)加載器(ld-linux.so)的預(yù)加載機(jī)制(PRELOAD)把一個(gè)事先寫好的庫(/lib/libSegFault.so)加載上,用于捕捉斷錯(cuò)誤的出錯(cuò)信息。
panfeng@ubuntu:~/segfault$ catchsegv ./segfault3
Segmentation fault (core dumped)
*** Segmentation fault
Register dump:
EAX: 00000000 EBX: 00fb3ff4 ECX: 00000002 EDX: 00000000
ESI: 080484e5 EDI: 080484e0 EBP: bfb7ad38 ESP: bfb7ad0c
EIP: 00ee806a EFLAGS: 00010203
CS: 0073 DS: 007b ES: 007b FS: 0000 GS: 0033 SS: 007b
Trap: 0000000e Error: 00000007 OldMask: 00000000
ESP/signal: bfb7ad0c CR2: 080484e0
Backtrace:
/lib/libSegFault.so[0x3b606f]
??:0(??)[0xc76400]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe6)[0xe89b56]
/build/buildd/eglibc-2.10.1/csu/../sysdeps/i386/elf/start.S:122(_start)[0x8048351]
Memory map:
分析過程
發(fā)現(xiàn)段錯(cuò)誤:
日志中的信息表明,進(jìn)程號(hào)為11274的進(jìn)程由于收到SIGSEGV信號(hào)而退出了。收到這個(gè)信號(hào)的時(shí)候,程序是可以生成core文件的。不過通過日志我們可以知道進(jìn)程11274退出時(shí)沒有生成core文件。因?yàn)樵趐hp-fpm的日志中,如果退出時(shí)生成了core文件,日志中會(huì)有“SIGSEGV – core dumped”字樣。如:
[20-Feb-2014 08:37:59] WARNING: [pool www] child 15845 exited on signal 11 (SIGSEGV – core dumped) after 1.051001 seconds from start
生成core文件:
為啥沒生成core文件?是因?yàn)槲覀兊南到y(tǒng)做了限制。執(zhí)行如下命令可以查看限制情況:
可以看出,系統(tǒng)對(duì)于core文件大小默認(rèn)限制是0.也就是說不能生成core文件??梢酝ㄟ^以下命令設(shè)置大小。
$ulimit -c unlimited
通過命令,我們就把系統(tǒng)對(duì)于core文件的大小限制去除了。
設(shè)置完后,重啟了php-fpm 進(jìn)程。剩下的事情,就是坐等core文件生成了。
第二天,查看php-fpm日志,發(fā)現(xiàn)了如下記錄:
[20-Feb-2014 08:37:59] WARNING: [pool www] child 15845 exited on signal 11 (SIGSEGV – core dumped) after 1.051001 seconds from start
[20-Feb-2014 08:39:04] WARNING: [pool www] child 17803 exited on signal 11 (SIGSEGV – core dumped) after 0.927973 seconds from start
[20-Feb-2014 08:42:18] WARNING: [pool www] child 23491 exited on signal 11 (SIGSEGV – core dumped) after 0.798308 seconds from start
說明,core文件已經(jīng)生成。
更多core文件生成和使用的相關(guān)信息請(qǐng)查看《 怎樣用core文件調(diào)試你的linux程序》
gdb分析core文件:
既然core文件生成了,現(xiàn)在該gdb上場(chǎng)了。通過如下命令查看程序退出時(shí)的棧信息。
$gdb -e /home/admin/php/sbin/php-fpm -c core.15845
…………..此處省略n多無關(guān)緊要的字
$info threads
3 process 15850 0x0000003cf92d3f9a in epoll_ctl () from /lib64/libc.so.6
2 process 15845 0x0000003cf92c4f65 in _xstat () from /lib64/libc.so.6
* 1 process 15851 0x00007fa94e230310 in ez_run (loop=0x2434c60, flags=0) at ez.c:2363
$thread 2
[Switching to thread 2 (process 15845)]#0 0x0000003cf92c4f65 in _xstat () from /lib64/libc.so.6
$bt
#0 0x0000003cf92c4f65 in _xstat () from /lib64/libc.so.6
#1 0x00007fa94df8fd8b in hsf::hsf_mkdir (path=0x7fa930001628 “/home/admin/logs/hsfcpp”) at /usr/include/sys/stat.h:436
#2 0x00007fa94df8feae in hsf::hsf_mkdirp (pathname=value optimized out) at utils/fileutils.cc:50
#3 0x00007fa94dfad7cc in hsf::hsf_stat_log_init (path=@0x7fa94e21f080, name=@0x7fffb607a620) at hsf/hsf_stat_file.cc:37
#4 0x00007fa94dfabb36 in hsf::hsf_stat_monitor::init (this=value optimized out) at hsf/hsf_stat_monitor.cc:231
#5 0x00007fa94dfa899a in hsf_core_bootstrap () at hsf/hsf.cc:104
#6 0x00007fa94dfa8cea in hsf::hsf_core::init () at hsf/hsf.cc:129
#7 0x00007fa94e448b52 in zm_activate_hsf (type=value optimized out, module_number=value optimized out) at /home/lingzhan/hsf_php_0.9/php_hsf.cpp:188
#8 0x000000000061d94c in ?? ()
#9 0x000000000226ee20 in ?? ()
#10 0x0000000000624c35 in ?? ()
#11 0x00000000024bc840 in ?? ()
#12 0x00000000024bc840 in ?? ()
#13 0x00000000024bc840 in ?? ()
#14 0×0000000000000000 in ?? ()
再繼續(xù)分析其他的兩個(gè)core文件,發(fā)現(xiàn)也都有這個(gè)棧信息?;究梢钥隙ㄊ莌sf的問題了。
另外,在/var/log/message 中也發(fā)現(xiàn)了如下記錄:
Mar 13 14:40:07 s006132.cm6 kernel: : [5332900.567547] php-fpm[31017]: segfault at 30 ip 00007fdc74df3310 sp 00000000435b8040 error 4 in libeasy.so.0[7fdc74de3000+23000]
libeasy.so 正是hsf中調(diào)用的。進(jìn)一步確認(rèn)是執(zhí)行hsf程序時(shí)出現(xiàn)問題的。
原文地址:如何找出發(fā)生SEGV內(nèi)存錯(cuò)誤的程序, 感謝原作者分享。
更多0
linux指令大全
稱:/etc/aliases
使用權(quán)限:系統(tǒng)管理者
使用方式: 請(qǐng)用 newaliases 更新資料庫
說明:
sendmail 會(huì)使用一個(gè)在 /etc/aliases 中的檔案做使用者名稱轉(zhuǎn)換的動(dòng)作。當(dāng) sendmail 收到一個(gè)要送給 xxx 的信時(shí),它會(huì)依據(jù) aliases檔的內(nèi)容送給另一個(gè)使用者。這個(gè)功能可以創(chuàng)造一個(gè)只有在信件系統(tǒng)內(nèi)才有效的使用者。例如 mailing list 就會(huì)用到這個(gè)功能,在 mailinglist 中,我們可能會(huì)創(chuàng)造一個(gè)叫 redlinux@link.ece.uci.edu 的 mailinglist,但實(shí)際上并沒有一個(gè)叫 redlinux 的使用者。實(shí)際 aliases 檔的內(nèi)容是將送給這個(gè)使用者的信都收給 mailing list 處理程式負(fù)責(zé)分送的工作。
/etc/aliases 是一個(gè)文字模式的檔案,sendmail 需要一個(gè)二進(jìn)位格式的 /etc/aliases.db。newaliases 的功能傳是將 /etc/aliases 轉(zhuǎn)換成一個(gè) sendmail 所能了解的資料庫。范例:
# newaliases
下面命令會(huì)做相同的事,
# sendmail -bi
相關(guān)命令:
mail, mailq, newaliases, sendmail
” mail [返回]
名稱:mail
使用權(quán)限:所有使用者
使用方式:mail [-iInv] [-s subject] [-c cc-addr] [-b bcc-addr] user1 [user 2 ...]
說明:
mail 不僅只是一個(gè)指令, mail 還是一個(gè)電子郵件程式,不過利用 mail 來讀信的人應(yīng)該很少吧!對(duì)于系統(tǒng)管理者來說 mail 就很有用,因?yàn)楣芾碚呖梢杂?mail 寫成 script ,定期寄一些備忘錄提醒系統(tǒng)的使用者。
參數(shù):
i 忽略 tty 的中斷訊號(hào)。 (interrupt)
I 強(qiáng)迫設(shè)成互動(dòng)模式。 (Interactive)
v 列印出訊息,例如送信的地點(diǎn)、狀態(tài)等等。 (verbose)
n 不讀入 mail.rc 設(shè)定檔。
s 郵件標(biāo)題。
c cc 郵件地址。
b bcc 郵件地址。
范例:
將信件送給一個(gè)或以上的電子郵件地址,由于沒有加入其他的選項(xiàng),使用者必須輸入標(biāo)題與信件的內(nèi)容等。而 user2 沒有主機(jī)位置,就會(huì)送給郵件伺服器的 user2 使用者。
mail user1@email.address
mail user1@email.address user2
將 mail.txt 的內(nèi)容寄給 user2 同時(shí) cc 給 user1 。如果將這一行指令設(shè)成 cronjob 就可以定時(shí)將備忘錄寄給系統(tǒng)使用者。
mail -s 標(biāo)題 -c user1 user2 mail.txt
指令:mesg
使用權(quán)限 : 所有使用者
使用方式 : mesg [y|n]
說明 : 決定是否允許其他人傳訊息到自己的終端機(jī)介面
把計(jì) ?
y : 允許訊息傳到終端機(jī)介面上。
n : 不允許訊息傳到終端機(jī)介面上 。
如果沒有設(shè)定,則訊息傳遞與否則由終端機(jī)界面目前狀態(tài)而定。
例子 :
改變目前訊息設(shè)定,改成不允許訊息傳到終端機(jī)介面上 :
mesg n
與 mesg 相關(guān)的指令有: talk,write,wall。
名稱:/etc/aliases
使用權(quán)限:系統(tǒng)管理者
使用方式: newaliases
說明:
sendmail 會(huì)使用一個(gè)在 /etc/aliases 中的檔案做使用者名稱轉(zhuǎn)換的動(dòng)作。當(dāng) sendmail 收到一個(gè)要送給 xxx 的信時(shí),它會(huì)依據(jù) aliases檔的內(nèi)容送給另一個(gè)使用者。這個(gè)功能可以創(chuàng)造一個(gè)只有在信件系統(tǒng)內(nèi)才有效的使用者。例如 mailing list 就會(huì)用到這個(gè)功能,在 mailinglist 中,我們可能會(huì)創(chuàng)造一個(gè)叫 redlinux@link.ece.uci.edu 的 mailinglist,但實(shí)際上并沒有一個(gè)叫 redlinux 的使用者。實(shí)際 aliases 檔的內(nèi)容是將送給這個(gè)使用者的信都收給 mailing list 處理程式負(fù)責(zé)分送的工作。
/etc/aliases 是一個(gè)文字模式的檔案,sendmail 需要一個(gè)二進(jìn)位格式的 /etc/aliases.db。newaliases 的功能傳是將 /etc/aliases 轉(zhuǎn)換成一個(gè) sendmail 所能了解的資料庫。
參數(shù):沒有任何參數(shù)。 范例:
# newaliases
下面命令會(huì)做相同的事,
# sendmail -bi
相關(guān)命令:
mail, mailq, newaliases, sendmail
名稱 : talk
使用權(quán)限 : 所有使用者
使用方式 :
talk person [ttyname]
說明 : 與其他使用者對(duì)談
把計(jì) :
person : 預(yù)備對(duì)談的使用者帳號(hào),如果該使用者在其他機(jī)器上,則可輸入 person@machine.name
ttyname : 如果使用者同時(shí)有兩個(gè)以上的 tty 連線,可以自行選擇合適的 tty 傳訊息
例子.1 :
與現(xiàn)在機(jī)器上的使用者Rollaend對(duì)談,此時(shí) Rollaend 只有一個(gè)連線 :
talk Rollaend
接下來就是等Rollaend回應(yīng),若Rollaend接受,則Rollaend輸入 `talk jzlee`即可開始對(duì)談,結(jié)束請(qǐng)按 ctrl+c
例子.2 :與linuxfab.cx上的使用者Rollaend對(duì)談,使用pts/2來對(duì)談 :
talk Rollaend@linuxfab.cx pts/2
接下來就是等Rollaend回應(yīng),若Rollaend接受,則Rollaend輸入 `talk jzlee@jzlee.home`即可開始對(duì)談,結(jié)束請(qǐng)按 ctrl+c
注意 : 若螢?zāi)坏淖謺?huì)出現(xiàn)不正常的字元,試著按 ctrl+l 更新螢?zāi)划嬅妗?/p>
名稱 : wall
使用權(quán)限 : 所有使用者
使用方式 :
wall [ message ]
使用說明:
wall 會(huì)將訊息傳給每一個(gè) mesg 設(shè)定為 yes 的上線使用者。當(dāng)使用終端機(jī)介面做為標(biāo)準(zhǔn)傳入時(shí), 訊息結(jié)束時(shí)需加上 EOF (通常用 Ctrl+D)?
例子 :
傳訊息"hi" 給每一個(gè)使用者 :
wall hi
名稱 : write
使用權(quán)限 : 所有使用者
使用方式 :
write user [ttyname]
說明 : 傳訊息給其他使用者
把計(jì) :
user : 預(yù)備傳訊息的使用者帳號(hào)
ttyname : 如果使用者同時(shí)有兩個(gè)以上的 tty 連線,可以自行選擇合適的 tty 傳訊息
例子.1 :
傳訊息給 Rollaend,此時(shí) Rollaend 只有一個(gè)連線 :
write Rollaend
接下來就是將訊息打上去,結(jié)束請(qǐng)按 ctrl+c
例子.2 :傳訊息給 Rollaend,Rollaend 的連線有 pts/2,pts/3 :
write Rollaend pts/2
接下來就是將訊息打上去,結(jié)束請(qǐng)按 ctrl+c
注意 : 若對(duì)方設(shè)定 mesg n,則此時(shí)訊席將無法傳給對(duì)方
名稱:kill
使用權(quán)限:所有使用者
使用方式:
kill [ -s signal | -p ] [ -a ] pid ...
kill -l [ signal ]
說明:kill 送出一個(gè)特定的信號(hào) (signal) 給行程 id 為 pid 的行程根據(jù)該信號(hào)而做特定的動(dòng)作, 若沒有指定, 預(yù)設(shè)是送出終止 (TERM) 的信號(hào)
把計(jì)?
-s (signal) : 其中可用的訊號(hào)有 HUP (1), KILL (9), TERM (15), 分別代表著重跑, 砍掉, 結(jié)束; 詳細(xì)的信號(hào)可以用 kill -l
-p : 印出 pid , 并不送出信號(hào)
-l (signal) : 列出所有可用的信號(hào)名稱
范例:
將 pid 為 323 的行程砍掉 (kill) :
kill -9 323
將 pid 為 456 的行程重跑 (restart) :
kill -HUP 456
名稱:nice
使用權(quán)限:所有使用者
使用方式:nice [-n adjustment] [-adjustment] [--adjustment=adjustment] [--help] [--version] [command ][arg...]]
說明:以更改過的優(yōu)先序來執(zhí)行程式, 如果未指定程式, 則會(huì)印出目前的排程優(yōu)先序, 內(nèi)定的 adjustment 為 10, 范圍為 -20 (最高優(yōu)先序) 到 19 (最低優(yōu)先序)
把計(jì)?
-n adjustment, -adjustment, --adjustment=adjustment 皆為將該原有優(yōu)先序的增加 adjustment
--help 顯示求助訊息
--version 顯示版本資訊
范例:
將 ls 的優(yōu)先序加 1 并執(zhí)行 :
nice -n 1 ls
將 ls 的優(yōu)先序加 10 并執(zhí)行 :
nice ls將 ls 的優(yōu)先序加 10 并執(zhí)行
注意 : 優(yōu)先序 (priority) 為作業(yè)系統(tǒng)用來決定 CPU 分配的參數(shù),Linux 使用『回合制(round-robin)』的演算法來做 CPU 排程,優(yōu)先序越高,所可能獲得的 CPU時(shí)間就越多。
名稱:ps
使用權(quán)限:所有使用者
使用方式:ps [options] [--help]
說明:顯示瞬間行程 (process) 的動(dòng)態(tài)
參數(shù):
ps 的參數(shù)非常多, 在此僅列出幾個(gè)常用的參數(shù)并大略介紹含義
-A 列出所有的行程
-w 顯示加寬可以顯示較多的資訊
-au 顯示較詳細(xì)的資訊
-aux 顯示所有包含其他使用者的行程
au(x) 輸出格式 :
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
USER: 行程擁有者
PID: pid
%CPU: 占用的 CPU 使用率
%MEM: 占用的記憶體使用率
VSZ: 占用的虛擬記憶體大小
RSS: 占用的記憶體大小
TTY: 終端的次要裝置號(hào)碼 (minor device number of tty)
STAT: 該行程的狀態(tài):
D: 不可中斷的靜止 (通悸□□縝b進(jìn)行 I/O 動(dòng)作)
R: 正在執(zhí)行中
S: 靜止?fàn)顟B(tài)
T: 暫停執(zhí)行
Z: 不存在但暫時(shí)無法消除
W: 沒有足夠的記憶體分頁可分配
: 高優(yōu)先序的行程
N: 低優(yōu)先序的行程
L: 有記憶體分頁分配并鎖在記憶體內(nèi) (即時(shí)系統(tǒng)或捱A I/O)
START: 行程開始時(shí)間
TIME: 執(zhí)行的時(shí)間
COMMAND:所執(zhí)行的指令
范例:
ps
PID TTY TIME CMD
2791 ttyp0 00:00:00 tcsh
3092 ttyp0 00:00:00 ps
% ps -A
PID TTY TIME CMD
1 ? 00:00:03 init
2 ? 00:00:00 kflushd
3 ? 00:00:00 kpiod
4 ? 00:00:00 kswapd
5 ? 00:00:00 mdrecoveryd
.......
% ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.7 1096 472 ? S Sep10 0:03 init [3]
root 2 0.0 0.0 0 0 ? SW Sep10 0:00 [kflushd]
root 3 0.0 0.0 0 0 ? SW Sep10 0:00 [kpiod]
root 4 0.0 0.0 0 0 ? SW Sep10 0:00 [kswapd]
........
名稱:pstree
使用權(quán)限:所有使用者
使用方式:
pstree [-a] [-c] [-h|-Hpid] [-l] [-n] [-p] [-u] [-G|-U] [pid|user]
pstree -V
說明:將所有行程以樹狀圖顯示, 樹狀圖將會(huì)以 pid (如果有指定) 或是以 init 這個(gè)基本行程為根 (root) ,如果有指定使用者 id , 則樹狀圖會(huì)只顯示該使用者所擁有的行程
參數(shù):
-a 顯示該行程的完整指令及參數(shù), 如果是被記憶體置換出去的行程則會(huì)加上括號(hào)
-c 如果有重覆的行程名, 則分開列出 (預(yù)設(shè)值是會(huì)在前面加上 *
范例:
pstree
init-+-amd
|-apmd
|-atd
|-httpd---10*[httpd]
%pstree -p
init(1)-+-amd(447)
|-apmd(105)
|-atd(339)
%pstree -c
init-+-amd
|-apmd
|-atd
|-httpd-+-httpd
| |-httpd
| |-httpd
| |-httpd
....
名稱:renice
使用權(quán)限:所有使用者
使用方式:renice priority [[-p] pid ...] [[-g] pgrp ...] [[-u] user ...]
說明:重新指定一個(gè)或多個(gè)行程(Process)的優(yōu)先序(一個(gè)或多個(gè)將根據(jù)所下的參數(shù)而定)
把計(jì)?
-p pid 重新指定行程的 id 為 pid 的行程的優(yōu)先序
-g pgrp 重新指定行程群組(process group)的 id 為 pgrp 的行程 (一個(gè)或多個(gè)) 的優(yōu)先序
-u user 重新指定行程擁有者為 user 的行程的優(yōu)先序
范例:
將行程 id 為 987 及 32 的行程與行程擁有者為 daemon 及 root 的優(yōu)先序號(hào)碼加 1 :
renice +1 987 -u daemon root -p 32
注意 : 每一個(gè)行程(Process)都有一個(gè)唯一的 (unique) id?
名稱:top
使用權(quán)限:所有使用者
使用方式:top [-] [d delay] [q] [c] [S] [s] [i] [n] [b]
說明:即時(shí)顯示 process 的動(dòng)態(tài)
把計(jì)?
d : 改變顯示的更新速度,或是在交談式指令列( interactive command)按 s
q : 沒有任何延遲的顯示速度,如果使用者是有 superuser 的權(quán)限,則 top 將會(huì)以最高的優(yōu)先序執(zhí)行
c : 切換顯示模式,共有兩種模式,一是只顯示執(zhí)行檔的名稱,另一種是顯示完整的路徑與名稱S : 累積模式,會(huì)將己完成或消失的子行程 ( dead child process ) 的 CPU time 累積起來
s : 安全模式,將交談式指令取消, 避免潛在的危機(jī)
i : 不顯示任何閑置 (idle) 或無用 (zombie) 的行程
n : 更新的次數(shù),完成后將會(huì)退出 top
b : 批次檔模式,搭配 "n" 參數(shù)一起使用,可以用來將 top 的結(jié)果輸出到檔案內(nèi)
范例:
顯示更新十次后退出 ;
top -n 10
使用者將不能利用交談式指令來對(duì)行程下命令 :
top -s
將更新顯示二次的結(jié)果輸入到名稱為 top.log 的檔案里 :
top -n 2 -b top.log
名稱:skill
使用權(quán)限:所有使用者
使用方式: skill [signal to send] [options] 選擇程序的規(guī)則
說明:
送個(gè)訊號(hào)給正在執(zhí)行的程序,預(yù)設(shè)的訊息為 TERM (中斷) , 較常使用的訊息為 HUP , INT , KILL , STOP , CONT ,和 0
訊息有三種寫法:分別為 -9 , -SIGKILL , -KILL , 可以使用 -l 或 -L 已列出可使用的訊息。
一般參數(shù):
-f 快速模式/尚未完成
-i 互動(dòng)模式/ 每個(gè)動(dòng)作將要被確認(rèn)
-v 詳細(xì)輸出/ 列出所選擇程序的資訊
-w 智能警告訊息/ 尚未完成
-n 沒有動(dòng)作/ 顯示程序代號(hào)
參數(shù):選擇程序的規(guī)則可以是, 終端機(jī)代號(hào),使用者名稱,程序代號(hào),命令名稱。
-t 終端機(jī)代號(hào) ( tty 或 pty )
-u 使用者名稱
-p 程序代號(hào) ( pid )
-c 命令名稱 可使用的訊號(hào):
以下列出已知的訊號(hào)名稱,訊號(hào)代號(hào),功能。
名稱 (代號(hào)) 功能/ 描述
ALRM 14 離開
HUP 1 離開
INT 2 離開
KILL 9 離開/ 強(qiáng)迫關(guān)閉
PIPE 13 離開
POLL 離開
PROF 離開
TERM 15 離開
USR1 離開
USR2 離開
VTALRM 離開
STKFLT 離開/ 只適用于i386, m68k, arm 和 ppc 硬體
UNUSED 離開/ 只適用于i386, m68k, arm 和 ppc 硬體
TSTP 停止 /產(chǎn)生與內(nèi)容相關(guān)的行為
TTIN 停止 /產(chǎn)生與內(nèi)容相關(guān)的行為
TTOU 停止 /產(chǎn)生與內(nèi)容相關(guān)的行為
STOP 停止 /強(qiáng)迫關(guān)閉
CONT 從新啟動(dòng) /如果在停止?fàn)顟B(tài)則從新啟動(dòng),否則忽略
PWR 忽略 /在某些系統(tǒng)中會(huì)離開
WINCH 忽略
CHLD 忽略
ABRT 6 核心
FPE 8 核心
ILL 4 核心
QUIT 3 核心
SEGV 11 核心
TRAP 5 核心
SYS 核心 /或許尚未實(shí)作
EMT 核心 /或許尚未實(shí)作
BUS 核心 /核心失敗
XCPU 核心 /核心失敗
XFSZ 核心 /核心失敗
范例:
停止所有在 PTY 裝置上的程序
skill -KILL -v pts/*
停止三個(gè)使用者 user1 , user2 , user3
skill -STOP user1 user2 user3
其他相關(guān)的命令: kill
名稱:expr
使用權(quán)限:所有使用者
### 字串長(zhǎng)度
shell expr length "this is a test"
14
### 數(shù)字商數(shù)
shell expr 14 % 9
5
### 從位置處抓取字串
shell expr substr "this is a test" 3 5
is is
### 數(shù)字串 only the first character
shell expr index "testforthegame" e
2
### 字串真實(shí)重現(xiàn)
shell expr quote thisisatestformela
thisisatestformela
方法一: Terminal終端輸入: gnome-system-monitor,就可以打開system monitor
如圖:
然后找到相應(yīng)進(jìn)程,右擊選擇kill process就可以了
方法二: 通過kill 進(jìn)程id的方式可以實(shí)現(xiàn),
首先需要知道進(jìn)程id, 例如,想要?dú)⑺纅irefox的進(jìn)程,通過 ps -ef|grep firefox,可以查到firefox的進(jìn)程id:
然后通過 kill 3781 就可以關(guān)閉進(jìn)程了.
補(bǔ)充: 1. kill -9 來強(qiáng)制終止退出, 例如: kill -9 3781
2.特殊用法:
kill -STOP [pid]
發(fā)送SIGSTOP (17,19,23)停止一個(gè)進(jìn)程,而并不消滅這個(gè)進(jìn)程。
kill -CONT [pid]
發(fā)送SIGCONT (19,18,25)重新開始一個(gè)停止的進(jìn)程。
kill -KILL [pid]
發(fā)送SIGKILL (9)強(qiáng)迫進(jìn)程立即停止,并且不實(shí)施清理操作。
kill -9 -1
終止你擁有的全部進(jìn)程。
方法三: killall 通過程序的名字,來殺死進(jìn)程
例如: killall firefox
注意: 該命令可以使用 -9 參數(shù)來強(qiáng)制殺死進(jìn)程, killall -9 firefox
方法四: pkill 通過程序的名字, 直接殺死所有進(jìn)程
例如: pkill firefox
方法五: 通過xkill 可以殺死圖形程序應(yīng)用, 例如firefox崩潰無響應(yīng),可以使用該命令.
例如: 用法xkill , 會(huì)出現(xiàn)一個(gè)白色的x, 然后用鼠標(biāo)單擊想要?dú)⑺赖膽?yīng)用,如圖
以下內(nèi)容引用自:
◆編者注:
KILLALL(Section: User (1)/Updated: 1999年9月7日)
———————————————–
NAME (名稱)
killall – 以名字方式來殺死進(jìn)程
SYNOPSIS (總覽)
killall [-egiqvw] [-signal] name …
killall -l
killall -V
DESCRIPTION (描述)
killall 發(fā)送一條信號(hào)給所有運(yùn)行任意指定命令的進(jìn)程. 如果沒有指定信號(hào)名, 則發(fā)送SIGTERM.。
信號(hào)可以以名字 (如 -HUP ) 或者數(shù)字 (如 -1 ) 的方式指定. 信號(hào) 0 (檢查進(jìn)程是否存在)只能以數(shù)字方式指定。
如果命令名包括斜杠 (/), 那么執(zhí)行該特定文件的進(jìn)程將被殺掉, 這與進(jìn)程名無關(guān)。
如果對(duì)于所列命令無進(jìn)程可殺, 那么 killall 會(huì)返回非零值. 如果對(duì)于每條命令至少殺死了一個(gè)進(jìn)程, killall 返回 0。Killall 進(jìn)程決不會(huì)殺死自己 (但是可以殺死其它 killall 進(jìn)程)。
OPTIONS (選項(xiàng))
-e
對(duì) 于很長(zhǎng)的名字, 要求準(zhǔn)確匹配. 如果一個(gè)命令名長(zhǎng)于 15 個(gè)字符, 則可能不能用整個(gè)名字 (溢出了). 在這種情況下, killall 會(huì)殺死所有匹配名字前 15 個(gè)字符的所有進(jìn)程. 有了 -e 選項(xiàng),這樣的記錄將忽略. 如果同時(shí)指定了 -v 選項(xiàng), killall 會(huì)針對(duì)每個(gè)忽略的記錄打印一條消息。
-g
殺死屬于該進(jìn)程組的進(jìn)程. kill 信號(hào)給每個(gè)組只發(fā)送一次, 即使同一進(jìn)程組中包含多個(gè)進(jìn)程。
-i
交互方式,在殺死進(jìn)程之前征求確認(rèn)信息。
-l
列出所有已知的信號(hào)名。
-q
如果沒有進(jìn)程殺死, 不會(huì)提出抱怨。
-v
報(bào)告信號(hào)是否成功發(fā)送。
-V
顯示版本信息。
-w
等待所有殺的進(jìn)程死去. killall 會(huì)每秒檢查一次是否任何被殺的進(jìn)程仍然存在, 僅當(dāng)都死光后才返回. 注意: 如果信號(hào)被忽略或沒有起作用, 或者進(jìn)程停留在僵尸狀態(tài), killall 可能會(huì)永久等待。
FILES(相關(guān)文件)
/proc proc文件系統(tǒng)的存在位置。
KNOWN bugS (已知 BUGS)
以文件方式殺死只對(duì)那些在執(zhí)行時(shí)一直打開的可執(zhí)行文件起作用, 也即, 混雜的可執(zhí)行文件不能夠通過這種方式殺死。
要警告的是輸入 killall name 可能不會(huì)在非 Linux 系統(tǒng)上產(chǎn)生預(yù)期的效果, 特別是特權(quán)用戶執(zhí)行時(shí)要小心。
在兩次掃描的間隙, 如果進(jìn)程消失了而被代之以一個(gè)有同樣 PID 的新進(jìn)程, killall -w 偵測(cè)不到。
來源:
下面來了解相關(guān)命令:
一、查看進(jìn)程的命令 有ps、pstree、pgrep等:
1、ps
顯示進(jìn)程信息,參數(shù)可省略
-aux 以BSD風(fēng)格顯示進(jìn)程 常用
-efH 以System V風(fēng)格顯示進(jìn)程
-e , -A 顯示所有進(jìn)程
a 顯示終端上所有用戶的進(jìn)程
x 顯示無終端進(jìn)程
u 顯示詳細(xì)信息
f 樹狀顯示
w 完整顯示信息
l 顯示長(zhǎng)列表
在終端中執(zhí)行ps aux,
各列輸出字段的含義:
USER 進(jìn)程所有者
PID 進(jìn)程ID
PPID 父進(jìn)程
%CPU CPU占用率
%MEM 內(nèi)存占用率
NI 進(jìn)程優(yōu)先級(jí)。數(shù)值越大,占用CPU時(shí)間越少
VSZ 進(jìn)程虛擬大小
RSS 頁面文件占用
TTY 終端ID
STAT 進(jìn)程狀態(tài)
+---D 不可中斷 Uninterruptible sleep (usually IO)
+---R 正在運(yùn)行,或在隊(duì)列中的進(jìn)程
+---S 處于休眠狀態(tài)
+---T 停止或被追蹤
+---Z 僵尸進(jìn)程
+---W 進(jìn)入內(nèi)存交換(從內(nèi)核2.6開始無效)
+---X 死掉的進(jìn)程
+--- 高優(yōu)先級(jí)
+---N 低優(yōu)先級(jí)
+---L 有些頁被鎖進(jìn)內(nèi)存
+---s 包含子進(jìn)程
+---+ 位于后臺(tái)的進(jìn)程組;
+---l 多線程,克隆線程 multi-threaded (using CLONE_THREAD, like NPTL pthreads do)
PID:進(jìn)程標(biāo)識(shí)符,系統(tǒng)為每一個(gè)進(jìn)程分配一個(gè)識(shí)別碼,稱為PID。
ps命令極為常用,其他命令還有:
2.pstree
樹狀顯示進(jìn)程信息
-a 顯示完整命令及參數(shù)
-c 重復(fù)進(jìn)程分別顯示
-c 顯示進(jìn)程ID PID
-n 按 PID 排列進(jìn)程
3.pgrep 進(jìn)程名
顯示進(jìn)程的PID
-l 顯示進(jìn)程名和進(jìn)程PID
-o 進(jìn)程起始ID
-n 進(jìn)程終止ID
二、結(jié)束進(jìn)程的命令 有kill、pkill、killall、xkill等:
kill [信號(hào)代碼] 進(jìn)程PID
根據(jù)PID向進(jìn)程發(fā)送信號(hào),常用來結(jié)束進(jìn)程,默認(rèn)信號(hào)為 -9
信號(hào)代碼,可取值如下:
-l [信號(hào)數(shù)字] 顯示、翻譯信號(hào)代碼
-9 , -KILL 發(fā)送 kill 信號(hào)退出
-6 , -ABRT 發(fā)送 abort 信號(hào)退出
-15 , -TERM 發(fā)送 Termination 信號(hào)
-1 , -HUP 掛起
-2 , -INT 從鍵盤中斷,相當(dāng)于 Ctrl+c
-3 , -QUIT 從鍵盤退出,相當(dāng)于 Ctrl+d
-4 , -ILL 非法指令
-11 , -SEGV 內(nèi)存錯(cuò)誤
-13 , -PIPE 破壞管道
-14 , -ALRM
-STOP 停止進(jìn)程,但不結(jié)束
-CONT 繼續(xù)運(yùn)行已停止的進(jìn)程
-9 -1 結(jié)束當(dāng)前用戶的所有進(jìn)程
pkill 進(jìn)程名
結(jié)束進(jìn)程族。如果結(jié)束單個(gè)進(jìn)程,請(qǐng)用 kill
killall 進(jìn)程名
killall和pkill 應(yīng)用方法差不多,也是直接殺死運(yùn)行中的程序;如果您想殺掉單個(gè)進(jìn)程,請(qǐng)用kill 來殺掉。
xkill
在圖形界面中點(diǎn)殺進(jìn)程。
當(dāng)xkill運(yùn)行時(shí)鼠標(biāo)指針變?yōu)轺俭t圖案,哪個(gè)圖形程序崩潰一點(diǎn)就OK了。如果您想終止xkill ,就按右鍵取消。
比如當(dāng)firefox 出現(xiàn)崩潰不能退出時(shí),點(diǎn)鼠標(biāo)就能殺死firefox 。
xkill 調(diào)用方法:
[root@localhost ~]# xkill
來源:
linux中pkill的簡(jiǎn)單用法
pkill 和killall 應(yīng)用方法差不多,也是直接殺死運(yùn)行中的程序;如果您想殺掉單個(gè)進(jìn)程,請(qǐng)用kill 來殺掉。
必要參數(shù)
-f 顯示完整程序
-l 顯示源代碼
-n 顯示新程序
-o 顯示舊程序
-v 與條件不符合的程序
-x 與條件符合的程序
選擇參數(shù)
-p進(jìn)程號(hào) 列出父進(jìn)程為用戶指定進(jìn)程的進(jìn)程信息
-t終端 指定終端下的所有程序
-u用戶 指定用戶的程序
應(yīng)用方法:
#pkill 正在運(yùn)行的程序名
舉例:
Java代碼
[root@localhost beinan]# pgrep -l gaim
2979 gaim
[root@localhost beinan]# pkill gaim
也就是說:
kill 對(duì)應(yīng)的是 PID
pkill 對(duì)應(yīng)的是COMMAND
例如在Ubuntu中強(qiáng)制結(jié)束一個(gè)已成僵尸的名稱為:firefox,PID為:1603的進(jìn)程,可以如下操作:
方法一:
(1)ctrl+alt+t,調(diào)出終端,輸入 top,然后就可以看到現(xiàn)在系統(tǒng)的進(jìn)程,是按占用資源從多到少排列的。
找到要關(guān)掉的進(jìn)程,記下該進(jìn)程第一列的數(shù)字編號(hào)(假設(shè)是xx),然后輸入q,退回終端。
(2)輸入:sudo kill xx(對(duì)應(yīng)剛才的編號(hào))。
方法二:
ctrl+alt+t,調(diào)出終端,輸入:sudo pkill firefox
范例1: 殺死指定進(jìn)程
Java代碼
root@snail-hnlinux:~# ps -A //顯示所有進(jìn)程
PID TTY TIME CMD
1 ? 00:00:03 init
2 ? 00:00:00 kthreadd
3 ? 00:00:00 migration/0
4 ? 00:00:00 ksoftirqd/0
5 ? 00:00:00 watchdog/0
……忽略部分
28382 ? 00:00:00 gvfsd-http
28391 ? 00:07:07 software-center
30467 ? 00:00:31 designer-qt4
30487 ? 00:00:06 gnome-terminal
30488 ? 00:00:00 gnome-pty-helpe
30489 pts/0 00:00:00 bash
30670 ? 00:00:00 debconf-communi
30749 pts/0 00:00:17 gedit
31155 ? 00:00:00 dhclient
31325 ? 00:00:01 sshd
31327 ? 00:00:00 sshd
31400 pts/1 00:00:00 bash
31485 pts/2 00:00:00 bash
31653 ? 00:00:00 aptd
31658 pts/1 00:00:00 ps
root@snail-hnlinux:~# pidof sshd //查看與sshd相關(guān)進(jìn)程
31327 31325 2095
root@snail-hnlinux:~# pkill -9 sshd //殺死指定進(jìn)程
范例2:殺死同義終端下的進(jìn)程
Java代碼
root@snail-hnlinux:~# pkill -t tty1 //殺死終端1下的所有進(jìn)程
范例3: 殺死指定用戶進(jìn)程
Java代碼
root@snail-hnlinux:~# pkill -u hnlinux
范例4:反向選擇
Java代碼
root@snail-hnlinux:~# pkill -vu hnlinux //殺死不屬于hnlinux用戶的所有進(jìn)程
————————————————
版權(quán)聲明:本文為CSDN博主「MrCoderr」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接: