在本文中,我们将带你了解Linux环境变量配置的6种方法,建议收藏!在这篇文章中,我们将为您详细介绍Linux环境变量配置的6种方法,建议收藏!的方方面面,并解答linux中环境变量配置常见的疑惑,同
在本文中,我们将带你了解Linux 环境变量配置的 6 种方法,建议收藏!在这篇文章中,我们将为您详细介绍Linux 环境变量配置的 6 种方法,建议收藏!的方方面面,并解答linux中环境变量配置常见的疑惑,同时我们还将给您一些技巧,以帮助您实现更有效的Linux Shell 自动交互/人机交互的 3 种方法、linux 下分卷压缩,合并解压的 3 种方法、linux 下加入 windows ad 域的 3 种方法、linux 下杀死进程(kill)的 N 种方法。
本文目录一览:- Linux 环境变量配置的 6 种方法,建议收藏!(linux中环境变量配置)
- Linux Shell 自动交互/人机交互的 3 种方法
- linux 下分卷压缩,合并解压的 3 种方法
- linux 下加入 windows ad 域的 3 种方法
- linux 下杀死进程(kill)的 N 种方法
Linux 环境变量配置的 6 种方法,建议收藏!(linux中环境变量配置)
Linux环境变量配置
在自定义安装软件的时候,经常需要配置环境变量,下面列举出各种对环境变量的配置方法。
下面所有例子的环境说明如下:
- 系统:Ubuntu 14.0
- 用户名:uusama
- 需要配置MySQL环境变量路径:/home/uusama/mysql/bin
Linux读取环境变量
读取环境变量的方法:
export
命令显示当前系统定义的所有环境变量echo $PATH
命令输出当前的PATH
环境变量的值
这两个命令执行的效果如下
uusama@ubuntu:~export
declare -x HOME="/home/uusama"
declare -x LANG="en_US.UTF-8"
declare -x LANGUAGE="en_US:"
declare -x LESSCLOSE="/usr/bin/lesspipe %s %s"
declare -x LESSOPEN="| /usr/bin/lesspipe %s"
declare -x LOGNAME="uusama"
declare -x MAIL="/var/mail/uusama"
declare -x PATH="/home/uusama/bin:/home/uusama/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
declare -x SSH_TTY="/dev/pts/0"
declare -x TERM="xterm"
declare -x USER="uusama"
uusama@ubuntu:~ echo $PATH
/home/uusama/bin:/home/uusama/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
其中PATH
变量定义了运行命令的查找路径,以冒号:
分割不同的路径,使用export
定义的时候可加双引号也可不加。
Linux环境变量配置方法一:export PATH
使用export
命令直接修改PATH
的值,配置MySQL进入环境变量的方法:
export PATH=/home/uusama/mysql/bin:PATH
# 或者把PATH放在前面
export PATH=PATH:/home/uusama/mysql/bin
注意事项:
- 生效时间:立即生效
- 生效期限:当前终端有效,窗口关闭后无效
- 生效范围:仅对当前用户有效
- 配置的环境变量中不要忘了加上原来的配置,即
$PATH
部分,避免覆盖原来配置
Linux环境变量配置方法二:vim ~/.bashrc
通过修改用户目录下的~/.bashrc
文件进行配置:
vim ~/.bashrc
# 在最后一行加上
export PATH=$PATH:/home/uusama/mysql/bin
注意事项:
- 生效时间:使用相同的用户打开新的终端时生效,或者手动
source ~/.bashrc
生效 - 生效期限:永久有效
- 生效范围:仅对当前用户有效
- 如果有后续的环境变量加载文件覆盖了
PATH
定义,则可能不生效Linux环境变量配置方法三:
vim ~/.bash_profile
和修改~/.bashrc
文件类似,也是要在文件最后加上新的路径即可:
vim ~/.bash_profile
# 在最后一行加上
export PATH=$PATH:/home/uusama/mysql/bin
注意事项:
- 生效时间:使用相同的用户打开新的终端时生效,或者手动
source ~/.bash_profile
生效 - 生效期限:永久有效
- 生效范围:仅对当前用户有效
- 如果没有
~/.bash_profile
文件,则可以编辑~/.profile
文件或者新建一个
Linux环境变量配置方法四:vim /etc/bashrc
该方法是修改系统配置,需要管理员权限(如root)或者对该文件的写入权限:
# 如果/etc/bashrc文件不可编辑,需要修改为可编辑
chmod -v u+w /etc/bashrc
vim /etc/bashrc
# 在最后一行加上
export PATH=$PATH:/home/uusama/mysql/bin
注意事项:
- 生效时间:新开终端生效,或者手动
source /etc/bashrc
生效 - 生效期限:永久有效
- 生效范围:对所有用户有效
Linux环境变量配置方法五:
vim /etc/profile
该方法修改系统配置,需要管理员权限或者对该文件的写入权限,和vim /etc/bashrc
类似:
# 如果/etc/profile文件不可编辑,需要修改为可编辑
chmod -v u+w /etc/profile
vim /etc/profile
# 在最后一行加上
export PATH=$PATH:/home/uusama/mysql/bin
注意事项:
- 生效时间:新开终端生效,或者手动
source /etc/profile
生效 - 生效期限:永久有效
- 生效范围:对所有用户有效
Linux环境变量配置方法六:vim /etc/environment
该方法是修改系统环境配置文件,需要管理员权限或者对该文件的写入权限:
# 如果/etc/bashrc文件不可编辑,需要修改为可编辑
chmod -v u+w /etc/environment
vim /etc/profile
# 在最后一行加上
export PATH=$PATH:/home/uusama/mysql/bin
注意事项:
- 生效时间:新开终端生效,或者手动
source /etc/environment
生效 - 生效期限:永久有效
- 生效范围:对所有用户有效
Linux环境变量加载原理解析
上面列出了环境变量的各种配置方法,那么Linux是如何加载这些配置的呢?是以什么样的顺序加载的呢?
特定的加载顺序会导致相同名称的环境变量定义被覆盖或者不生效。
环境变量的分类
环境变量可以简单的分成用户自定义的环境变量以及系统级别的环境变量。
- 用户级别环境变量定义文件:
~/.bashrc
、~/.profile
(部分系统为:~/.bash_profile
) - 系统级别环境变量定义文件:
/etc/bashrc
、/etc/profile
(部分系统为:/etc/bash_profile
)、/etc/environment
另外在用户环境变量中,系统会首先读取~/.bash_profile
(或者~/.profile
)文件,如果没有该文件则读取~/.bash_login
,根据这些文件中内容再去读取~/.bashrc
。
测试Linux环境变量加载顺序的方法
为了测试各个不同文件的环境变量加载顺序,我们在每个环境变量定义文件中的第一行都定义相同的环境变量UU_ORDER
,该变量的值为本身的值连接上当前文件名称。
需要修改的文件如下:
- /etc/environment
- /etc/profile
- /etc/profile.d/test.sh,新建文件,没有文件夹可略过
- /etc/bashrc,或者/etc/bash.bashrc
- ~/.bash_profile,或者~/.profile
- ~/.bashrc](http://mp.weixin.qq.com/s?
在每个文件中的第一行都加上下面这句代码,并相应的把冒号后的内容修改为当前文件的绝对文件名。
export UU_ORDER="$UU_ORDER:~/.bash_profile"
修改完之后保存,新开一个窗口,然后echo $UU_ORDER
观察变量的值:
uusama@ubuntu:~echoUU_ORDER
$UU_ORDER:/etc/environment:/etc/profile:/etc/bash.bashrc:/etc/profile.d/test.sh:~/.profile:~/.bashrc
可以推测出Linux加载环境变量的顺序如下:
- /etc/environment
- /etc/profile
- /etc/bash.bashrc
- /etc/profile.d/test.sh
- ~/.profile
- ~/.bashrc
Linux环境变量文件加载详解
由上面的测试可容易得出Linux加载环境变量的顺序如下,:
系统环境变量 -> 用户自定义环境变量 /etc/environment -> /etc/profile -> ~/.profile
打开/etc/profile
文件你会发现,该文件的代码中会加载/etc/bash.bashrc
文件,然后检查/etc/profile.d/
目录下的.sh
文件并加载。
# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).
if [ "PS1" ]; then
if [ "BASH" ] && [ "BASH" != "/bin/sh" ]; then
# The file bash.bashrc already sets the default PS1.
# PS1=''h:w$ ''
if [ -f /etc/bash.bashrc ]; then
. /etc/bash.bashrc
fi
else
if [ "`id -u`" -eq 0 ]; then
PS1=''# ''
else
PS1='' ''
fi
fi
fi
if [ -d /etc/profile.d ]; then
for i in /etc/profile.d/*.sh; do
if [ -r i ]; then
.i
fi
done
unset i
fi
其次再打开~/.profile
文件,会发现该文件中加载了~/.bashrc
文件。
# if running bash
if [ -n "BASH_VERSION" ]; then
# include .bashrc if it exists
if [ -f "HOME/.bashrc" ]; then
. "HOME/.bashrc"
fi
fi
# set PATH so it includes user''s private bin directories
PATH="HOME/bin:HOME/.local/bin:PATH"
从~/.profile
文件中代码不难发现,/.profile
文件只在用户登录的时候读取一次,而/.bashrc
会在每次运行Shell
脚本的时候读取一次。
一些小技巧
可以自定义一个环境变量文件,比如在某个项目下定义uusama.profile
,在这个文件中使用export
定义一系列变量,然后在~/.profile
文件后面加上:sourc uusama.profile
,这样你每次登陆都可以在Shell脚本中使用自己定义的一系列变量。
也可以使用alias
命令定义一些命令的别名,比如alias rm="rm -i"
(双引号必须),并把这个代码加入到~/.profile
中,这样你每次使用rm
命令的时候,都相当于使用rm -i
命令,非常方便。
Linux Shell 自动交互/人机交互的 3 种方法
如果你要学习linux,你可能会遇到Linux Shell自动交互问题,这里将介绍Linux Shell自动交互的解决方法,在这里拿出来和大家分享一下。
一、背景
shell脚本在处理自动循环或大的任务方面可节省大量的时间,通过创建一个处理任务的命令清单,使用变量、条件、算术和循环等方法快速创建脚本以完成相应工作,这比在命令行下一个个敲入命令要省时省力得多。
但是有时候我们可能会需要实现和交互程序如ftp,telnet服务器等进行交互的功能,这时候我们需要用到shell的自动交互功能,本文收集了较常用的三种自动交互方法,并进行了比较和总结。
二、需求
需求1:
从一台Linux机器ftp登陆到另一台Linux机器,进行系列操作后关闭,懒得每次都手动输入密码。
需求2:
改变登录用户密码,懒得每次都输入新旧密码。
需求3:
希望su自动登录到root账户,懒得每次都输入root密码。
三、调试环境
终端:SecureCRT
系统:WinXP, CentOS 4.4(VmWare)
Shell: bash
注:shell有很多种,B类SHELL(sh, bash, ksh)之间行为相近;C类SHELL(csh, tcsh)之间行为相近,还有zsh和rc等shell,本文的调试环境是bash。
四、自动交互方法一
自动交互最关键的就是交互信息的自动输入,首先联想到文件重定向,在shell编程中有这样一种用法(参考Linux与UNIX SHELL编程指南 chapt 5.7):"command << delimiter 从标准输入中读入,直至遇到delimiter分界符。"
重定向操作符command << delimiter是一种非常有用的命令,shell将分界符delimiter之后直至下一个同样的分界符之前的所有内容都作为输入,遇到下一个分界符, shell就知道输入结束了。最常见的delimiter分界符是EOF,当然完全可以自定为其他字符。
对于需求1 要求的自动登陆ftp,并作系列操作,则可以用这种方法进行自动交互。代码如下:
#!/bin/bash
ftp -i -n 192.168.167.187 << EOF
user hzc 123456
Pwd
cd test
Pwd
Close
Bye
EOF
五、自动交互方法二
需求2中要求采用非交互的方式改变登录用户密码,尝试用方法1,无法实现。
这时候联想到交互信息的另一个自动输入方法,管道,通过echo + sleep + | 可以实现这个需求。
#!/bin/bash
(echo "curpassword"
sleep 1
echo "newpassword"
sleep 1
echo "newpassword")|passwd
测试通过,运行这个脚本,直接把当前用户的 curpassword 改成 newpassword。
六、自动交互方法三
需求3中要求自动登录root账号,尝试方法1和方法2,都出现错误提示standard in must be a tty。
这时候尝试寻找外部帮助,一个shell工具expect可以实现这个功能,其实expect就是一个专门用来实现自动交互功能的工具,expect的语法可以参考相关资料,代码如下:
#!/usr/bin/expect
spawn su root
expect "password: "
send "123456\r"
expect eof
expect eof
测试通过,运行这个脚本,直接从当前用户登录到root用户。
七、方法总结
方法一(重定向)简单直观,也经常有实际应用,但是在自动交互领域功能有限。
方法二(管道)也很简单直观,有时甚至不用sleep配合就能展现强大的自动交互实力,但是在某些时候也束手无策。
方法三(expect)在功能上是最为强大的,expect本来就是为实现自动交互功能而生,但是缺点是需要安装expect包,在嵌入式等环境下难以安装。
三个方法各有优劣,应用的好,都可以完成Linux Shell自动交互。
‘小神’为大家准备了以下资源,扫描下方二维码和我一起探索Linux的世界
linux 下分卷压缩,合并解压的 3 种方法
我们上传东西的时候,由于文件过大而不能上传,或者不给上传,最明显的就是发邮件了,附件最大 5M,有的 10M。如果超过了就郁闷了。这个时候,如果能把压缩的东西,分割开来就比较爽了,windows 下面我想大家知道怎么分割,利用 winrar,winzip 图型化设置压缩出来的块的大小。但是在 linux 下面有没有这样的方法了,linux 下面有 rar 命令,有 zip 命令,windows 下面这二种方式可以分割压缩,我想 linux 下面绝对也是可以的。下面是我尝试过程的记录:
一,rar 分卷压缩和合并解压
rar -h
我们会发现以下参数,要创建多大的卷。
v Create volumes with size autodetection or list all volumes
v<size>[k,b] Create volumes with size=<size>*1000 [*1024, *1]
[zhangy@BlackGhost awksed]$ rar a -v5m google.rar Google_Maps_API.doc //-v和5m之间不要有空格
RAR 3.92 Copyright (c) 1993-2010 Alexander Roshal 10 Feb 2010
Shareware version Type RAR -? for help
Evaluation copy. Please register.
Creating archive google.rar
Adding Google_Maps_API.doc
Calculating the control sum
Creating archive google.part2.rar
... Google_Maps_API.doc
Calculating the control sum
Creating archive google.part3.rar
... Google_Maps_API.doc OK
Calculating the control sum
Done
[zhangy@BlackGhost awksed]$ unrar x google.part1.rar //合并并解压
UNRAR 3.90 freeware Copyright (c) 1993-2009 Alexander Roshal
Extracting from google.part1.rar
Extracting Google_Maps_API.doc
Extracting from google.part2.rar
... Google_Maps_API.doc 76%
Extracting from google.part3.rar
... Google_Maps_API.doc OK
All OK
二,zip 分卷压缩和合并解压
zip -h2
你会发现,分卷参数 - s,意思是说分割成多大的卷
Splits (archives created as a set of split files):
-s ssize create split archive with splits of size ssize, where ssize nm
n number and m multiplier (kmgt, default m), 100k -> 100 kB
下面的意思是说如果是分卷的了,用 -s 0 --out 把分卷合成一个
If input is split, output will default to same split size
Use -s=0 or -s- to turn off splitting to convert split to single file:
zip in_split_archive -s 0 --out out_single_file_archive
用 zip 来分卷压缩时,他必须是.zip 的形势,他的流程是这样的,先把一般文件压缩成.zip 的文件,然后在将.zip 的文件分成多少块,如果你不这样坐呢,会提示错误的。
[zhangy@BlackGhost awksed]$ zip -s 4m Google_Maps_API.doc
zip error: Invalid command arguments (archive name must end in .zip for splits)
[zhangy@BlackGhost awksed]$ zip google.zip Google_Maps_API.doc //先压缩不然就报上面的错
adding: Google_Maps_API.doc(deflated 12%)
[zhangy@BlackGhost awksed]$ zip -s 4m google.zip --out ziptest //分卷
copying: Google_Maps_API.doc
[zhangy@BlackGhost awksed]$ zip ziptest -s 0 --out google_bak.zip //这样合卷有问题
copying: Google_Maps_API.doc
[zhangy@BlackGhost awksed]$ cat ziptest.z* > google_bak.zip //利用cat来合卷
[zhangy@BlackGhost awksed]$ unzip google_bak.zip //解压
上面呢用 zip 来分卷是没有问题的,但是合卷的时候就有问题了,zip -s 0 --out 这样的方式,合出来的卷,大约只有分卷前的一半,这就搞的我很无语了,并且解压的时候,提示我输入密码,在次无语,只好有 cat 来合并了,还好合并后,解压没有任何问题。
三,利用 split 来分卷,cat 来合并分卷
我花了很长时间去研究 tar 的参数,研究了好长时间,还是没有找到可以分卷的参数,英语还是不过关啊,唉。不过我们可以借助 split 来分卷
[zhangy@BlackGhost awksed]$ tar czvf google.tar.gz Google_Maps_API.doc
Google_Maps_API.doc
[zhangy@BlackGhost awksed]$ split -d -b 4m google.tar.gz
[zhangy@BlackGhost awksed]$ cat x* > google_bak.tar.gz
[zhangy@BlackGhost awksed]$ tar zxvf google_bak.tar.gz
Google_Maps_API.doc
linux 下加入 windows ad 域的 3 种方法
下面是 3 种 linux 下加入 Windows Acitve Directory 并用 AD 验证帐号的方法。
假设您的环境是 AD server: server.redhat.com
realm: redhat.com
方法 1:
该方法适用于有图形界面的环境。
执行命令
# system-config-authentication
方法 2:
该方法适用于文本界面环境。
执行命令
# setup
选择
Authentication
方法 3:
该方法适用于文本界面环境。
修改 /etc/krb5.conf
[root@client1 ~]# cat /etc/krb5.conf
[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log
[libdefaults]
default_realm = REDHAT.COM
dns_lookup_realm = false
dns_lookup_kdc = false
ticket_lifetime = 24h
forwardable = yes
[realms]
REDHAT.COM = {
kdc = server.redhat.com.com:88
admin_server = server.redhat.com:749
default_domain = redhat.com
}
[domain_realm]
redhat.com = REDHAT.COM
.redhat.com = REDHAT.COM
[appdefaults]
pam = {
debug = false
ticket_lifetime = 36000
renew_lifetime = 36000
forwardable = true
krb4_convert = false
}
[root@client1 ~]#
2 修改 /etc/samba/smb.conf
[global]
#--authconfig--start-line--
workgroup = redhat.com
password server = server.redhat.com
realm = REDHAT.COM
security = ads
idmap uid = 16777216-33554431
idmap gid = 16777216-33554431
template shell = /bin/bash
winbind use default domain = false
winbind offline logon = false
#--authconfig--end-line--
3 修改 /etc/nsswitch.conf
passwd: files winbind
shadow: files winbind
group: files winbind
4 修改 pam 认证模块
添加
[root@client1 ~]# cat /etc/pam.d/system-auth-ac
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth required pam_env.so
auth sufficient pam_unix.so nullok try_first_pass
auth requisite pam_succeed_if.so uid >= 500 quiet
auth sufficient pam_winbind.so use_first_pass
auth required pam_deny.so
account required pam_unix.so broken_shadow
account sufficient pam_succeed_if.so uid < 500 quiet
account [default=bad success=ok user_unknown=ignore] pam_winbind.so
account required pam_permit.so
password requisite pam_cracklib.so try_first_pass retry=3
password sufficient pam_unix.so md5 shadow nullok try_first_pass
use_authtok
password sufficient pam_winbind.so use_authtok
password required pam_deny.so
session optional pam_keyinit.so revoke
session required pam_limits.so
session [success=1 default=ignore] pam_succeed_if.so service in
crond quiet use_uid
session required pam_unix.so
session optional pam_mkhomedir.so
5 加入 Windows Active Directory 域
[root@client1 ~]# net ads join -S server.redhat.com -W REDHAT.COM -U
Administrator
6 启动 winbind
# chkconfig --level 35 winbind on
# service winbind restart
本文同步分享在 博客 “xjsunjie”(51CTO)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与 “OSC 源创计划”,欢迎正在阅读的你也加入,一起分享。
linux 下杀死进程(kill)的 N 种方法
常规篇:
首先,用 ps 查看进程,方法如下:
$ ps -ef
……
smx 1822 1 0 11:38 ? 00:00:49 gnome-terminal
smx 1823 1822 0 11:38 ? 00:00:00 gnome-pty-helper
smx 1824 1822 0 11:38 pts/0 00:00:02 bash
smx 1827 1 4 11:38 ? 00:26:28 /usr/lib/firefox-3.6.18/firefox-bin
smx 1857 1822 0 11:38 pts/1 00:00:00 bash
smx 1880 1619 0 11:38 ? 00:00:00 update-notifier
……
smx 11946 1824 0 21:41 pts/0 00:00:00 ps -ef
或者:
$ ps -aux
……
smx 1822 0.1 0.8 58484 18152 ? Sl 11:38 0:49 gnome-terminal
smx 1823 0.0 0.0 1988 712 ? S 11:38 0:00 gnome-pty-helper
smx 1824 0.0 0.1 6820 3776 pts/0 Ss 11:38 0:02 bash
smx 1827 4.3 5.8 398196 119568 ? Sl 11:38 26:13 /usr/lib/firefox-3.6.18/firefox-bin
smx 1857 0.0 0.1 6688 3644 pts/1 Ss 11:38 0:00 bash
smx 1880 0.0 0.6 41536 12620 ? S 11:38 0:00 update-notifier
……
smx 11953 0.0 0.0 2716 1064 pts/0 R+ 21:42 0:00 ps -aux
此时如果我想杀了火狐的进程就在终端输入:
$ kill -s 9 1827
其中 - s 9 制定了传递给进程的信号是9,即强制、尽快终止进程。各个终止信号及其作用见附录。
1827 则是上面 ps 查到的火狐的 PID。
简单吧,但有个问题,进程少了则无所谓,进程多了,就会觉得痛苦了,无论是 ps -ef 还是 ps -aux,每次都要在一大串进程信息里面查找到要杀的进程,看的眼都花了。
进阶篇:
改进1:
把 ps 的查询结果通过管道给 grep 查找包含特定字符串的进程。管道符 “|” 用来隔开两个命令,管道符左边命令的输出会作为管道符右边命令的输入。
$ ps -ef | grep firefox
smx 1827 1 4 11:38 ? 00:27:33 /usr/lib/firefox-3.6.18/firefox-bin
smx 12029 1824 0 21:54 pts/0 00:00:00 grep --color=auto firefox
这次就清爽了。然后就是
$kill -s 9 1827
还是嫌打字多?
改进2—— 使用 pgrep:
一看到 pgrep 首先会想到什么?没错,grep!pgrep 的 p 表明了这个命令是专门用于进程查询的 grep。
$ pgrep firefox
1827
看到了什么?没错火狐的 PID,接下来又要打字了:
$kill -s 9 1827
改进3—— 使用 pidof:
看到 pidof 想到啥?没错 pid of xx,字面翻译过来就是 xx 的 PID。
$ pidof firefox-bin
1827
和 pgrep 相比稍显不足的是,pidof 必须给出进程的全名。然后就是老生常谈:
$kill -s 9 1827
无论使用 ps 然后慢慢查找进程 PID 还是用 grep 查找包含相应字符串的进程,亦或者用 pgrep 直接查找包含相应字符串的进程PID,然后手动输入给kill杀掉,都稍显麻烦。有没有更方便的方法?有!
改进4:
$ps -ef | grep firefox | grep -v grep | cut -c 9-15 | xargs kill -s 9
说明:
“grep firefox” 的输出结果是,所有含有关键字 “firefox” 的进程。
“grep -v grep” 是在列出的进程中去除含有关键字 “grep” 的进程。
“cut -c 9-15” 是截取输入行的第 9 个字符到第 15 个字符,而这正好是进程号 PID。
“xargs kill -s 9” 中的 xargs 命令是用来把前面命令的输出结果(PID)作为 “kill -s 9” 命令的参数,并执行该命令。“kill -s 9” 会强行杀掉指定进程。
难道你不想抱怨点什么?没错太长了
改进5:
知道 pgrep 和 pidof 两个命令,干嘛还要打那么长一串!
$ pgrep firefox | xargs kill -s 9
改进6:
$ ps -ef | grep firefox | awk ''{print $2}'' | xargs kill -9
kill: No such process
有一个比较郁闷的地方,进程已经正确找到并且终止了,但是执行完却提示找不到进程。
其中 awk ''{print $2}'' 的作用就是打印(print)出第二列的内容。根据常规篇,可以知道 ps 输出的第二列正好是 PID。就把进程相应的 PID 通过 xargs 传递给 kill 作参数,杀掉对应的进程。
改进7:
难道每次都要调用 xargs 把 PID 传递给 kill?答案是否定的:
$kill -s 9 `ps -aux | grep firefox | awk ''{print $2}''`
改进8:
没错,命令依然有点长,换成 pgrep。
$kill -s 9 `pgrep firefox`
改进 9——pkill:
看到 pkill 想到了什么?没错 pgrep 和 kill!pkill=pgrep+kill。
$pkill -9 firefox
说明:"-9" 即发送的信号是 9,pkill 与 kill 在这点的差别是:pkill 无须 “s”,终止信号等级直接跟在 “-“ 后面。之前我一直以为是 "-s 9",结果每次运行都无法终止进程。
改进 10——killall:
killall 和 pkill 是相似的,不过如果给出的进程名不完整,killall 会报错。pkill 或者 pgrep 只要给出进程名的一部分就可以终止进程。
$killall -9 firefox
附录:各种信号及其用途
Signal | Description | Signal number on Linux x86[1] |
---|---|---|
SIGABRT | Process aborted | 6 |
SIGALRM | Signal raised by alarm | 14 |
SIGBUS | Bus error: "access to undefined portion of memory object" | 7 |
SIGCHLD | Child process terminated, stopped (or continued*) | 17 |
SIGCONT | Continue if stopped | 18 |
SIGFPE | Floating point exception: "erroneous arithmetic operation" | 8 |
SIGHUP | Hangup | 1 |
SIGILL | Illegal instruction | 4 |
SIGINT | Interrupt | 2 |
SIGKILL | Kill (terminate immediately) | 9 |
SIGPIPE | Write to pipe with no one reading | 13 |
SIGQUIT | Quit and dump core | 3 |
SIGSEGV | Segmentation violation | 11 |
SIGSTOP | Stop executing temporarily | 19 |
SIGTERM | Termination (request to terminate) | 15 |
SIGTSTP | Terminal stop signal | 20 |
SIGTTIN | Background process attempting to read from tty ("in") | 21 |
SIGTTOU | Background process attempting to write to tty ("out") | 22 |
SIGUSR1 | User-defined 1 | 10 |
SIGUSR2 | User-defined 2 | 12 |
SIGPOLL | Pollable event | 29 |
SIGPROF | Profiling timer expired | 27 |
SIGSYS | Bad syscall | 31 |
SIGTRAP | Trace/breakpoint trap | 5 |
SIGURG | Urgent data available on socket | 23 |
SIGVTALRM | Signal raised by timer counting virtual time: "virtual timer expired" | 26 |
SIGXCPU | CPU time limit exceeded | 24 |
SIGXFSZ | File size limit exceeded | 25 |
关于Linux 环境变量配置的 6 种方法,建议收藏!和linux中环境变量配置的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于Linux Shell 自动交互/人机交互的 3 种方法、linux 下分卷压缩,合并解压的 3 种方法、linux 下加入 windows ad 域的 3 种方法、linux 下杀死进程(kill)的 N 种方法等相关内容,可以在本站寻找。
本文标签: