linux用户管理命令 用户管理----用户信息与密码的配置文件
用户管理要学的内容很多,当然了,不会简单的放两个创建用户的命令,这样的文章太多了。我们来看两个用户管理中非常重要的配置文件吧!
我们来看看用户的相关配置文件都存放在什么地方。
用户信息文件: /etc/passwd
密码文件: /etc/shadow
用户组文件: /etc/group
用户组密码文件: /etc/gshadow
用户配置文件:
/etc/login.defs
/etc/default/useradd
新用户信息文件:/etc/skel
登录信息: /etc/motd
用户信息文件详解====================
我们先看一下用户信息文件里都放的什么
[[email protected] ~]# vi /etc/passwd
root❌0:0:root:/root:/bin/bash
daemon❌2:2:daemon:/sbin:/sbin/nologin
adm❌3:4:adm:/var/adm:/sbin/nologin
lp❌4:7:lp:/var/spool/lpd:/sbin/nologin
sync❌5:0:sync:/sbin:/bin/sync
shutdown❌6:0:shutdown:/sbin:/sbin/shutdown
halt❌7:0:halt:/sbin:/sbin/halt
mail❌8:12:mail:/var/spool/mail:/sbin/nologin
news❌9:13:news:/etc/news:/sbin/nologin
…
每一行内容存放一个用户的信息,每个用户信息有7部分组成
root❌0:0:root:/root:/bin/bash
root 用户名 用户登录系统时使用的用户名
x 密码 密码位
2 UID 用户标识号
2 GID 缺省组标识
root 注释性描述 例如存放用户全名等信息
/root 宿主目录 用户登录系统后的缺省目录
/bin/bash 命令解释器 用户使用的Shell ,默认为bash
UID ?
关于上面的UID这里细说一下,其实决定用户是什么权限,是由UID号决定的。
linux用户分为三种:
超级用户:(root UID=0)
普通用户: (UID 500~60000)
伪用户: (UID 1~499)
所以,我们可以修改用户的UID号来修改用户的类型,如果把root的UID号为500,那么root就变成了普通用户,如果把fnngj用户的UID改为0,那么它就拥有了root用户的超能力。
[[email protected] ~]# vi /etc/passwd 进入之后修改,完了保存退出就OK了。
伪用户?
说到用户种类,又牵扯到一个伪用户,那么伪用户是干什么用的?
1.伪用户与系统和程序服务相关
bin、daemon、shutdown、halt等,任何Linux系统默认都有这些伪用户。
mail、news、games、apache、ftp、mysql及sshd等,与linux系统的进程相关。
2. 伪用户通常不需要或无法登录系统
3. 可以没有宿主目录
密码文件详解==============
用户密码文件,用户信息文件中留有密码位,为什么没密码了呢? 其实,最早的linux这个位置真的是放密码的,因为不全安,所以,就将密码单独存放了,现在只是用x表示这里有存放密码的位置。
为什么要把密码放在/etc/shadow中
[[email protected] /]# ls -l /etc/shadow
-r-------- 1 root root 1021 2月 27 21:31 /etc/shadow 我可以看到这个文件只有管理员root有权限查看修改
现在我们来看密码文件都放了什么?
[[email protected] /]# more /etc/shadow
root:$1tF.az6hWi27oaaFw7OpFs.:15391:0:99999:7:::
bin::15391:0:99999:7:::
daemon::15391:0:99999:7:::
adm::15391:0:99999:7:::
lp::15391:0:99999:7:::
sync::15391:0:99999:7:::
shutdown::15391:0:99999:7:::
halt::15391:0:99999:7:::
mail::15391:0:99999:7:::
news::15391:0:99999:7:::
uucp::15391:0:99999:7:::
operator::15391:0:99999:7:::
games::15391:0:99999:7:::
…
我们还以第一行为例进行分解。
root:$1tF.az6hWi27oaaFw7OpFs.:15391:0:99999:7:::
root 用户名 用户登录系统时使用的用户名
$1tF.az6hWi27oaaFw7OpFs. 密码 加密密码 MD5
15391 最后一次修改时间 linux这里以1970年1月1日作为1,1971年1月1日就是366,依次类推到我修改密码的日期表示为15391了。
0 最小时间间隔 这个字段代表要经过多久才可以更改密码。如果是“0”表密码可以随时更改。
99999 最大时间间隔 于害怕密码被人盗取而危害到整个系统的安全,所以安排了这个字段,你必须在这个时间内重新修改密码,否则这个帐号将暂时失效。上面的99999,表示密码不需要重新输入,最好设定一段时间修改密码。确保系统安全
7 密码变更期期限快到前的警告期:当帐号的密码失效期限快到时,系统依据这个字段的设定发出警告,提醒用户“再过n天您的密码将过期,请尽快重新设定密码。默认的是七天。
帐号失效期: 如果用户过了警告期没有重新输入密码,使得密码失效,而该用户在这个字段限定的时间内又没有向管理员反映,让帐号重新启用,那么这个帐号将暂时失效。
帐号取消日期: 这个日期跟第三个字段一样,都是使用1970年以来的日期设定方法。这个字段表示:这个帐号在此字段规定的日期之后将无法再使用。这个字段通常用于收费服务系统中,可以规定一个日期让该帐号不能再使用。
保留: 最后一个字段是保留的,看以后有没有新功能加入。
疑问:既然shadow文件保存了密码,而passwd文件中没有保存密码,为什么不把passwd文件中的密码位取消掉呢?
其实,密码在存放之前,是先放在passwd文件中的,然后再转换到shadow文件中的。下面来验证下
[[email protected] /]# grep root /etc/passwd /etc/shadow
/etc/passwd:root❌0:0:root:/root:/bin/bash
/etc/passwd:operator❌11:0:operator:/root:/sbin/nologin
/etc/shadow:root:$1tF.az6hWi27oaaFw7OpFs.:15391:0:99999:7:::
[[email protected] /]# pwunconv 将密码回写
[[email protected] /]# grep root /etc/passwd /etc/shadow
/etc/passwd:root:$1tF.az6hWi27oaaFw7OpFs.:0:0:root:/root:/bin/bash
/etc/passwd:operator:*:11:0:operator:/root:/sbin/nologin
grep: /etc/shadow: 没有那个文件或目录
[[email protected] /]# pwconv 转换到shdow文件中,只不过平时这个动作平时由linux自动完成。
[[email protected] /]# grep root /etc/passwd /etc/shadow
/etc/passwd:root❌0:0:root:/root:/bin/bash
/etc/passwd:operator❌11:0:operator:/root:/sbin/nologin
/etc/shadow:root:$1tF.az6hWi27oaaFw7OpFs.:15456:0:99999:7:::
linux对用户登录的验证就是通passwod文件来验证用户名是否存在,然后通过shadow文件来验证用户名对应的密码是否正确,那么理解了底层东西很有必要,我们可以不需要去学习创建用户命令,真接通过vim命令在两个文件中添加用户。这就是linux的魅力噢。不像windows一样,我们不但知其然,还知其所以然。
“会灵魂附体的”命令权限
继续用户管理的学习,上一小节我们知道,只有root可以修改密码文件,那么普通用户为什么可以修改自己的密码,这是因为我们所操作有命令“灵魂附体”般的拥有了root权限。这个小节自我感觉不教难理解,而我的内容也是顺着思路写,按着顺序看,最好去试验一下。^_^
小节重点:
setUID=4 所有人
setGID=2 所属组
粘着位=1 其它人
创建用户:
[[email protected] ~]# useradd lisi 添加创建了一用户lisi
[[email protected] ~]# passwd lisi 设置lisi的密码
Changing password for user wangwu.
New UNIX password: 这里输入密码
BAD PASSWORD: it is based on a dictionary word
Retype new UNIX password: 再次确认密码
passwd: all authentication tokens updated successfully.
上面这种是不被推荐的一种创建用户的方式,任何的用户都应该属于某个组。创建这样的“散人”实际中没有太大意义。
[[email protected] ~]# grep lisi /etc/passwd
lisi❌502:502::/home/lisi:/bin/bash
从上面信息中看到,系统默认为我们创建了一个lisi的组,组ID为504
用户切换:
[[email protected] ~]# su – lisi root切换到lisi用户
[[email protected] root]$ su – root lisi用户切换到root
Password: 普通用户切换root用户是要密码的哟!亲!
普通用户切换到其它普通用户也是要密码的哟!
用户修改密码:
[[email protected] root]$ passwd
Changing password for user lisi.
Changing password for wangwu
(current) UNIX password: 先输入原始密码
New UNIX password: 输入新有密码
Retype new UNIX password: 再次确认新密码
passwd: all authentication tokens updated successfully.
上面是铺垫,下面才是重点。。
思考:在上一节中,我们提到,存放用户密码的文件shadow只有root用户才可操作。那么普通用户为什么可以修改密码呢?
=setUID=======
这里引出一个东东----setUID
定义:当一个可执行程序具有setUID权限,用户执行这个程序时,将以这个程序所有者的身份执行。
哈哈!小狼不能和小羊谈朋友,小羊可以与小羊谈朋友,于是,小狼披上了羊的外衣,然后以羊的身份和小羊一起幸福的生活。吼吼。
其实,用户执行的这个程序就是命令,passwd命令授权了SetUID权限。所以普通用户也可以通过passwd命令改密码。
下面来做个试验!!很有意思的噢,要不要也来试试噢?
切换到lisi用户下面。
[[email protected] ~]$ touch file01 touch创建一个file01的文件
[[email protected] ~]$ ls -l file01
-rw-rw-r-- 1 lisi lisi 0 5月 5 22:14 file01
我们看到,这个时候用touch命令创建的文件,所有者是lisi,所属于组是lisi组
切换到root下面
[[email protected] ~]# ls -l /bin/touch
-rwxr-xr-x 1 root root 38056 2009-07-03 /bin/touch
细心朋友会发现权限前面还多一位。没错!setUID就属于这一位。
setUID=4
现在我们给touch命令授予个setUID授予setUID权限有两种方式。
[[email protected] ~]# chmod u+s /bin/touch
[[email protected] ~]# chmod 4755 /bin/touch
关于用户权限不理解的看我之前的相关文章。
再次切换到lisi目录下
[[email protected] ~]$ touch file02 创建文件file02
[[email protected] ~]$ ls -l file02
-rw-rw-r-- 1 root lisi 0 5月 5 22:35 file02
这次我们发现,同样的一个命令touch ,这次创建出来的文件所有者变成的root
去掉setUID权限的两种方式:
[[email protected] ~]# chmod u-s /bin/touch
[[email protected] ~]# chmod 755 /bin/touch
setGID=========
setGID的用法与setUID的用法一起,它是添加组权限的。
setGID=2
添加setGID的方式如下:
[[email protected] ~]# chmod g+s /bin/touch
[[email protected] ~]# chmod 2755 /bin/touch
一般的命令我们不能随便授予setUID权限假如给vi命令授予setUID命令,无疑于给linux留了个后面,那样我们就可以通过vi命令修改用户与密码信息文件了。
那么到底有哪些命令设置有setUID呢?我们可以查找一下。
[[email protected] ~]# find / -perm -4000 -o -perm -2000
在当前目录下(/)查找具有setUID(-perm -4000)或者(-o)具有
setGID(-perm -2000)权限的命令
=粘着位============
粘着位有什么作用,我们来看一个例子,这样更容易理解。。
[[email protected] test]# mkdir abc 创建一个目录abc
[[email protected] test]# touch abc/newfile 在这个目录下创建一个文件newfile
[[email protected] test]# chmod 777 abc 对这个目录设置权限为所有人都有所有权限
[[email protected] test]# ls -ld abc
drwxrwxrwx 2 root root 4096 5月 5 23:44 abc
[[email protected] test]# ls -l abc/newfile newfile文件的权限是其它人没有删改的权限。
-rw-r–r-- 1 root root 0 5月 5 23:44 abc/newfile
切换到lisi用户
[[email protected] test]$ rm -rf abc
具然把abc目录下面的newfile干掉了,lisi用户虽然有对abc目录的所有权限,但对newfile文件没有删除权限呀。这就是linux对文件的权限规定。
假如张三和李四对一个文件夹都有所有权,这个文件夹下放的有张三的文件,也有李四的文件,如果张三看李四的文件不爽,那么他就直接干掉了,李四上去一看哭了。为什么办法让李四不哭呢?这里就用到粘着位了。
粘着位
粘着位=1
t,如果一个权限为777目录有粘着位,每个用户都可以在这个目录下创建文件,但只能删除自己是所有者的文件。
粘着位的授权方式:
[[email protected] test]# chmod o+t abc
[[email protected] test]# chmod 1755 abc
我们再来删除试试:
[[email protected] abc]$ rm newfile
rm:是否删除有写保护的一般空文件‘newfile’? y
rm: 无法删除‘newfile’: 权限不够
自己创建的文件就可以删除噢!
[[email protected] test]# touch newfile2
[[email protected] test]# rm newfile2
rm:是否删除一般空文件‘newfile2’? y
用户组权限实例
先直接抛一个需求出来吧!先步骤完成了,后面再分析。
授权用户 chongshi 和 bugmaster 对目录/cnblogs有写权限
创建目录
[[email protected] hzh]# mkdir /cnblogs 创建目录
[[email protected] hzh]# ls -ld /cnblogs 查看目录
drwxr-xr-x 2 root root 4096 5月 10 23:20 /cnblogs
添加两个用户并设置密码
[[email protected] hzh]# useradd chongshi 创建用户
[[email protected] hzh]# passwd chongshi 设置密码
Changing password for user chongshi.
New UNIX password:
BAD PASSWORD: it is based on a dictionary word
Retype new UNIX password:
passwd: all authentication tokens updated successfully.
[[email protected] hzh]# useradd bugmaster
[[email protected] hzh]# passwd bugmaster
Changing password for user bugmaster.
New UNIX password:
BAD PASSWORD: it is based on a dictionary word
Retype new UNIX password:
passwd: all authentication tokens updated successfully.
添加一个组
[[email protected] hzh]# groupadd testing 创建组
[[email protected] hzh]# grep testing /etc/group 查看组信息
testing❌506:
将用户添加到组中
[[email protected] hzh]# usermod -G testing chongshi 用户chongshi添加到组testing
[[email protected] hzh]# gpasswd -a bugmaster testing 用户bugmaster添加到组testing
Adding user bugmaster to group testing
注意:上面两种方式不同,但作用是一样的,都是将用户添加到组中。
[[email protected] hzh]# grep testing /etc/group 查看组中成员
testing❌506:chongshi,bugmaster
我们知道,组有什么样的权限,组中成员也有什么样的权限。
设置cnblogs目录的所属组为testing
[[email protected] hzh]# chgrp testing /cnblogs 将/cnblogs目录的所属组改为testing
[[email protected] hzh]# ls -ld /cnblogs 查看目录所属组
drwxr-xr-x 2 root testing 4096 5月 10 23:20 /cnblogs
对组加写权限
[[email protected] hzh]# chmod g+w /cnblogs 对组加写权限
[[email protected] hzh]# ls -ld /cnblogs 查看组对目录的权限
drwxrwxr-x 2 root testing 4096 5月 10 23:20 /cnblogs
现在用户chongshi和bugmaster已经对/cnbogs已经有写权限
[[email protected] hzh]# su – chongshi 切换用户
[[email protected] hzh]$ touch /cnblogs/abc 创建文件,(可以成功在目录下创建文件,说明对本目录具有写权限)
用户常用操作命令
添加一个用户
添加用户稍微复杂一些,我们先来看一下,添加用户都有那些选项
[email protected]:/# useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/sh
SKEL=/etc/skel
CREATE_MAIL_SPOOL=no
参数详解:
-u:UID
-g:缺省所属用户组GID
-G:指定所属多个组
-d:宿目录
-s:命令解释器Shell
-c:描述信息
-e:指定用户失效时间
例子:
[email protected]:/# useradd -u 1888 -g webadmin -G sys,root -s /bin/bash -c “market lisi” -e 2012-12-12 jack
添加用户到组
usermod -G [组名] [用户名]
[email protected]:/# usermod -G webadmin tom
[email protected]:/# grep webadmin /etc/group
webadmin❌1001:tom
修改用户名
usermod -l [新用户名] [旧用户名]
修改用户与添加用户时的内容基本相同,但多了一个修改用户的选项。
[email protected]:/# usermod -l tom jack 把jack改为tom
删除用户
userdel -r [用户名]
-r:删除用户组
手工删除:
使用find命令查找属于某个用户或用户组的文件
find选项 -user、-uid、-group、-gid、
1、对需要保留的文件进行移动和备份
2、对不需要的文件进行删除
3、清除用户文件中的相关表项
4、清除用户宿主目录
[[email protected] /]# find /home -user fnngj
/home/fnngj
/home/fnngj/.bashrc
/home/fnngj/.bash_profile
/home/fnngj/.gtkrc
/home/fnngj/.bash_history
/home/fnngj/.bash_logout
可以对查找出来的用户信息判断需要干掉哪些。
用户信息查看命令
pwck 检测/etc/passwd文件
检测用户的设置文件是否正常。直接输入命令,后面不用带参数
vipw 编辑/etc/passwd文件
这个命令与vi最大的区别就是编辑的时候锁定文件。如果多人对passwd文件
都有编辑权限,那么多人同时编辑就会造成混乱。使用vipw编辑passwd文件时,别
人就无法打开passwd文件。
id 查看用户ID和组信息,直接输入命令,后面不用带参数
[[email protected] fnngj]# id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6
(disk),10(wheel) context=root:system_r:unconfined_t
finger 查看当前用户的登录信息
finger [用户名] 查看某个用户的详细信息。
[[email protected] fnngj]# finger
Login Name Tty Idle Login Time Office Office Phone
root root pts/1 May 13 14:57 (192.168.203.1)
[[email protected] fnngj]# finger root
Login: root Name: root
Directory: /root Shell: /bin/bash
On since 日 5月 13 14:57 (CST) on pts/1 from 192.168.203.1
New mail received 日 5月 6 11:00 2012 (CST)
Unread since 三 2月 22 20:40 2012 (CST)
No Plan.
su [用户名] 切换用户(su- 环境变量切换)
su - [用户名] 切换的时候也会把环境的时候也会切换环境变量
[[email protected] /]# su fnngj
[[email protected] /]$ echo su root
Password:
[[email protected] /]# su - fnngj
[[email protected] ~]$ echo $PATH
/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/fnngj/bin
passwd -S [用户名] 查看用户密码状态
[[email protected] fnngj]# passwd -S fnngj
Password set, MD5 crypt.
who、w 查看当前登录用户信息
[[email protected] ~]$ who
root pts/1 May 13 14:57 (192.168.203.1)
[[email protected] ~]$ w
15:11:29 up 54 min, 1 user, load average: 0.00, 0.00, 0.00
USER TTY FROM [email protected] IDLE JCPU PCPU WHAT
root pts/1 192.168.203.1 14:57 0.00s 0.84s 0.01s w
用户禁用与恢复
禁用和恢复用户
当一个用户在操作的时候经常有违规操作或近期一段时间不用,我们可以对这
个用户进行锁定。就像你的游戏账号发生异常被禁用一样。
禁用
#usermod -L username
#passwd -l username
恢复
#usermod -U username
#passwd -u username
[[email protected] /]# passwd -l fnngj 禁用fnngj用户
Locking password for user fnngj.
passwd: Success
[[email protected] /]# passwd -S fnngj
Password locked. 提示被禁用
[[email protected] /]# passwd -u fnngj 密码解锁
Unlocking password for user fnngj.
passwd: Success.
[[email protected] /]# passwd -S fnngj
Password set, MD5 crypt.
禁用原理:
[[email protected] /]# grep fnngj /etc/shadow
fnngj:EudBseaZ$kw1S8ZS2dsvnJ83phhvQF0:15456:0:99999:7:::
[[email protected] /]# passwd -l fnngj
Locking password for user fnngj.
passwd: Success
[[email protected] /]# grep fnngj /etc/shadow
fnngj:!!EudBseaZ$kw1S8ZS2dsvnJ83phhvQF0:15456:0:99999:7:::
看到上面的操作,相信你已经明白了,当我禁用你的密码后,密码在shadwo文件中依然存在,只是前面多了两个叹号(!!),这样你肯定登录不了了,因为验证端改变了密码。当然,解锁之后,密码前面的两个叹号会去掉。
其实,我们知道了原理以后,完全可以不用通过命令,通过vi编辑文件,一样可以禁用用户。
用户组常用操作命令
先看一下组配置文件里都存放了哪些内容
[[email protected] /]# more /etc/group
root❌0:root
bin❌1:root,bin,daemon
daemon❌2:root,bin,daemon
sys❌3:root,bin,adm
adm❌4:root,adm,daemon
tty❌5:
disk❌6:root
lp❌7:daemon,lp
mem❌8:
kmem❌9:
wheel❌10:root
mail❌12:mail
news❌13:news
uucp❌14:uucp
man❌15:
games❌20:
gopher❌30:
…
dialout❌20:fnngj
dialout 组名 用户登录时所在的组
x 组密码 一般不用
20 GID 组标识号
fnngj 组内用户列表 属于该组的所有用户列表
添加用户组
groupadd [用户组名]
[email protected]:/# groupadd webadmin 添加一个组webadmin
[email protected]:/# grep webadmin /etc/group 查看组信息
webadmin❌1001:
我们在添加组的时候也可以指定好组的id
[email protected]:/# groupadd -g 8888 webadmin
[email protected]:/# grep webadmin /etc/group
webadmin❌8888:
删除用户组:
groupdel [用户组名]
[[email protected] /]# groupdel webadmin 删除组webadmin
修改用户组信息
groupmod -n [新组名] [旧组名]
[[email protected] /]# groupmod -n apache webadmin 修改组名webadmin为apache
用户组信息查看命令
groups 查看用户隶属于哪些用户组
[[email protected] /]# groups fnngj
fnngj : fnngj
newgrp 切换用户组
[[email protected] /]# newgrp fnngj 不是组成员,知道组密码(如果有密码)一样可
以切换。
grpck 用户组配置文件检测
chgrp 修改文件所属组
vigr 编辑/etc/group文件(锁定文件)
与vipw用法一样,在编辑group文件时,禁止其他人编辑。防止多人写操作,造成写混乱。
用户组管理命令
gpasswd命令
这个事所有linux都有的一个命令。先看一下都有哪些参数。
[email protected]:/# gpasswd
Usage: gpasswd [option] GROUP
Options:
-a, --add USER add USER to GROUP
-d, --delete USER remove USER from GROUP
-h, --help display this help message and exit
-r, --remove-password remove the GROUP’s password
-R, --restrict restrict access to GROUP to its members
-M, --members USER,… set the list of members of GROUP
-A, --administrators ADMIN,…
set the list of administrators for GROUP
Except for the -A and -M options, the options cannot be combined.
上面的参数信息虽然事英文的,不解释了,相信你懂的。
用法非常简单:
[email protected]:/# gpasswd -a tom webadmin 添加用户到组
[email protected]:/# gpasswd -d tom webadmin 把用户从组中删除
[email protected]:/# gpasswd webadmin 给用户组设置密码
[email protected]:/# gpasswd -A tom webadmin 将tom提升为组管理员
[email protected]:/# gpasswd -r webadmin 删除组密码
[email protected]:/# gpasswd -R webadmin 禁止其他用户切换到该组
目录:(内容较多,加个目录)
|-进程管理
进程常用命令
|- w查看当前系统信息
|- ps进程查看命令
|- kill终止进程
|- 一个存放内存中的特殊目录/proc
|- 进程的优先级
|- 进程的挂起与恢复
|- 通过top命令查看进程
计划任务
|- 计划任务的重要性
|- 一次性计划at和batch
|- 周期性计划crontab
进程管理的概念
进程和程序区别
1.程序是静态概念,本身作为一种软件资源长期保存;而进程是程序的执行过程,它是动态概念,有一定的生命期,是动态产生和消亡的。
2.程序和进程无一一对应关系。一个程序可以由多个时程公用;另一一方面,一个进程在活动中有可顺序地执行若干个程序
父子进程的关系
1.子进程是由一个进程所产生的进程,产生这个子进程的进程称为父进程
2.在linux系统中,使用系统调用fork创建进程。fork复制的内容包括父进程的数据和堆栈段以及父进程的进程环境。
3.父进程终止子进程自然终止。
前台进程和后台进程
前台进程
在shell提示处理打入命令后,创建一个子进程,运行命令,Shell等待命令退出,然后返回到对用户给出提示符。这条命令与Shell异步运行,即在前台运行,用户在它完成之前不能执行别一个命令
很简单,我们在执行这个查找命令时,无法进行其它操作,这个查找就属于前台进程
后台进程
在Shell提示处打入命令,若后随一个&,Shell创建子进程运行此命令,但不等待命令退出,而直接返回到对用户给出提示。这条命令与Shell同步运行,即在后台运行。“后台进程必须是非交互式的”
再来看这个命令就变成了后台进程,我们用同样的条件进行查找,把查找记过放到hzh/test/init.find这个文件中。不影响我们前台其它的操作。
进程的状态
学过操作系统原理的同学应该可以看得懂,不懂再去翻翻书,不知道你有没有想起当时教这门课的老师呢?呵呵
常用进程命令
w 查看当前系统信息
w命令,我在之前的章节用曾用过,当时是查看当前用户信息,当然也可以查看到系统相关的信息。
作用:查看当前系统活动摘要。
[[email protected] cron]# w
14:48:39 up 2:46, 1 user, load average: 0.00, 0.01, 0.00
USER TTY FROM [email protected] IDLE JCPU PCPU WHAT
root pts/1 192.168.203.1 12:27 0.00s 0.17s 0.02s w
w显示信息的含义:
JCPU: 以终端代号来区分,该终端所有相关的进程的进程执行时,所消耗的CPU时间会显示在这里
PCPU: cpu执行程序消耗的时间
WHAT: 用户下在执行的操作
load average :分别显示系统在过去1、5、15分钟内的平均负载程度。
FROM: 显示用户从何处登录系统,“:0”的显示代表该用户时人X Windows下,打开文本模式窗口登录的
IDLE: 用户闲置的时间,这是一个计时器,一旦用户执行任何操作,该计时器便会被重置
查看个别用户信息:w [用户名]
[[email protected] ~]# w root
23:32:01 up 52 min, 1 user, load average: 0.00, 0.00, 0.00
USER TTY FROM [email protected] IDLE JCPU PCPU WHAT
root pts/1 192.168.203.1 22:53 0.00s 0.10s 0.01s w root
ps进程查看命令
ps应该是查看进程用得最普遍的命令,我在之前的面试中都被多次问到过。因为linux不是面试我的重点,所以,我后来特意去查了一下。ps我以前的理解就是photoshop的缩写。哈哈!因为以前本专门跑去学过平面设计。吼吼,扯远了!
进程查看命令:ps
常用选项:
-a:显示所有用户的进程
-u:显示用户名和启动时间
-x:显示 没有控制终端的进程
-e:显示所有进程,包括没有控制终端的进程
-l:长格式显示
-w:宽行显示,可以使用多个w进行加宽显示
应用实例:
ps 查看隶属自己的进程
[email protected]:~# ps
PID TTY TIME CMD
1370 pts/0 00:00:00 bash
3185 pts/0 00:00:00 ps
[email protected]:~# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 5941 5801 4 80 0 - 1882 wait pts/2 00:00:00 bash
4 R 0 6000 5941 0 80 0 - 1121 - pts/2 00:00:00 ps
看一下上面的选项都指的什么。。
PID : 进程号
PPLD: 父进程的进程号
TTY : 进程启动的终端
STAT : 进程当前状态(S休眠状态,D不可中断的休眠状态,R运行状态,Z僵死状态,T停止)
NI : 进程优先级
TIME: 进程自从启动以后启用CPU的总时间
COMMAND/CMD:进程的命令名
USER: 用户名
%CPU: 占用CPU时间和总时间的百分比
%MEM: 占用内存与系统内存总量的百分比
实列:
ps -u or -l 查看隶属于自己进程详细信息
[email protected]:~# ps -u or -l
ps -le or -aux 查看所有用户执行的进程的详细信息
[email protected]:~# ps le or -aux
ps -aux --sort pid 可按进程执行的时间、PID、UID等对进程进行排序
[email protected]:~# ps -aux --sort pid
ps -uU fnngj 查看某个用记启动的进程
[email protected]:~# ps -uU fnngj
ps -le | grep init 查看指定进程信息
[email protected]:~# ps -le | grep init
kill终止进程
在winddow下面,我们要结束一个进程,最简单的方式就是关闭这个程序,相应的进程也会随之结束,遇到不能关闭的情况。会打开任务管理器结果掉。那么在linux下如果做呢?我们可以使用kill命令来终止进程。
为什么要杀死进程?
- 该进程点用了过多的CPU时间
- 该进程缩住了一个终端,使其他前台进程无法运行
- 运行时间过长,但没有预期效果
- 产生了过多到屏幕或磁盘文件的输出
- 无法正常退出
kill用法:
关闭进程:kill [进程号]
[email protected]:~# kill -l
-
SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
-
SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
-
SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
-
SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
-
SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
-
SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
-
SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
-
SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
-
SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
-
SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX- 12
-
SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
-
SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
-
SIGRTMAX-1 64) SIGRTMAX
我们看到每个编号对应一个含义,如 9) SIGKILL ;9标注的是SIGKILL ,那么我们可用9来终止进程。
关闭进程:
kill -s 9 [进程号] (强行关闭)
kill -9 [进程号] (强行关闭)
上面的两种形式都可以强行关闭进程。
重启进程:
有时候我们需要把进程重新启动一下,可以下面的命令完成。
kill -1 [进程号] (重启进程)
[email protected]:~# kill -1 3567 重启PID为3567的进程
关闭图形程序:
关闭图形程序: xkill
当你在终端下输入这个命令时,你的鼠标会变成一个小叉子,你只去点你想要关闭的窗口就可以关闭了
其它:
结束所有进程: killall
查找服务进程号: pgrep [服务名称]
关闭进程: pkill [进程名称]
一个存放内存中的特殊目录/proc
这个目录比较特殊,他并不在我们磁盘上,而在我们的内存当中;当前系统运行的所有进程都动态的存放在这个目录中。
[email protected]:~# ls /proc
1 14 15 187 287 820 dma net
10 1401 1524 19 3 827 driver pagetypeinfo
1037 1403 1525 1906 32 830 execdomains partitions
1043 1413 1527 1919 34 832 fb sched_debug
1047 1414 1531 2 35 834 filesystems schedstat
11 1415 1536 20 36 840 fs scsi
1172 1418 1544 2024 454 842 interrupts self
12 1423 1555 2025 459 843 iomem slabinfo
…
上面每个编号就是以我们当前进程PID所命令的目录名。
当然,当前目录下也存放了一些我们系统的信息
查看我们当前cpu的信息
[email protected]:~# cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 23
model name : Pentium® Dual-Core CPU T4500 @ 2.30GHz
stepping : 10
cpu MHz : 2294.000
cache size : 1024 KB
fdiv_bug : no
hlt_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 13
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov
pat
pse36 clflush dts acpi mmx fxsr sse sse2 ss nx constant_tsc up arch_perfmon
pebs
bts xtopology tsc_reliable aperfmperf pni ssse3 hypervisor dts
bogomips : 4588.00
clflush size : 64
cache_alignment : 64
address sizes : 40 bits physical, 48 bits virtual
power management:
查看内存信息
[email protected]:~# cat /proc/meminfo
MemTotal: 508344 kB
MemFree: 10668 kB
Buffers: 10700 kB
Cached: 96056 kB
SwapCached: 34124 kB
Active: 231384 kB
Inactive: 231576 kB
Active(anon): 178524 kB
Inactive(anon): 178316 kB
Active(file): 52860 kB
Inactive(file): 53260 kB
…
查看当前分区的信息
[email protected]:~# cat /proc/partitions
major minor #blocks name
8 0 20971520 sda
8 1 20446208 sda1
8 2 1 sda2
8 5 522240 sda5
进程的优先级
我们学过操作系统原理的同学都知道,我们系统在执行程序时有会先后顺序的,但为什么我们的电脑可以边听音乐,边聊QQ,边上网,甚至还可以同时挂几个游戏。因为我们CPU运行超快。他可以把每个程序的进程排好队,这个执行一下,那个执行一下。所以,我们会觉得各种程序是并行运行的。
当然,进程也会分个快慢缓急的,所以要对进程分个优先级。同学们在食堂排队打饭,总理来了,这优先级多高啊。同学们纷纷让开,先给总理打。
- 优先级取值范围为(-20,19)
linux给我们提供的优先级的范围为-20到19,我们启动一个进程时,默认的优先级为0 ,-20的优先级为最大,或者说最高。当然,我们在设置的时候可以写-30,但系统默认为-20。
nice命令
指定程序的运行优先级
格式:nice -n command
例如:nice --5 command
renice 命令
改变一个正在运行的进程的优先级
格式: renice n pid
例如:renice -5 777
例子:
[[email protected] cron]# ps -le
[[email protected] cron]# renice -20 [PID]
nohup命令可以在用户退出时继续执行某一进程
一般的命令在用户退登录后就停止执行了,nohup命令可以使进程在用户退出登录后仍旧继续执行,nohup命令将执行后的数据信息和错误信息默认存储到文件nohup.out中
格式:
nohup program &
例子:
[[email protected] cron]# nohup find / -name init* > /hzh/test/find.init.20120520 &
如果我们没指定/hzh/test/find.init.20120520这个保存位置的话,系统默认会把查询的结果放到nohup.out的文件中。我们一般不会去使用默认方式保存。
进程的挂起与恢复
当我们执行一条命令时,发现太慢或输出内容太多,最常用到的做法就是终止(ctrl+c),那么挂起呢?通俗一点就是暂停呗!_!!
进程中止(挂起)和终止
挂起(ctrl+z)
终止(ctrl+c)
[[email protected] ~]# find / -name init* > /hzh/test/find.init.20120520
[1]+ Stopped find / -name init* >/hzh/test/find.init.20120520
被暂停的进程会提示我们Stopped
小知识:系统中有两种运行的进程,我们在前台是看不到的。一种是后台执行的命令,一种就是被暂停的。那我们通过什么方式查看被暂停和后台执行的进程呢?
查看被挂起的进程(jobs)
进程的恢复:
恢复到前台继续运行(fg)
恢复到后台继续运行(bg)
[[email protected] ~]# jobs 通过jobs命令可以查看后被暂停的进程
[1]+ Stopped find / -name init* >/hzh/test/find.init.20120520
[[email protected] ~]# fg fg会将暂停的进程恢复到前台继续执行。
find / -name init* >/hzh/test/find.init.20120520
[[email protected] ~]# bg bg会将暂停的进程恢复到后台继续执行
[1]+ find / -name init* >/hzh/test/find.init.20120520 &
通过top命令查看进程
top命令与前面介绍的ps命令相似,已经介绍了ps,为什么还要top?top有它自己的优点呢。它比ps显示的信息更详细。而且是动态的噢,信息是在不断变化的噢!
[[email protected] ~]# top
top - 12:45:16 up 43 min, 1 user, load average: 0.00, 0.04, 0.06
Tasks: 57 total, 1 running, 56 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.3% us, 0.3% sy, 0.0% ni, 99.3% id, 0.0% wa, 0.0% hi, 0.0% si
Mem: 1034536k total, 232864k used, 801672k free, 60188k buffers
Swap: 1052248k total, 0k used, 1052248k free, 118692k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
6848 root 15 0 28948 8444 2524 S 0.3 0.8 0:05.44 X
7181 root 16 0 7036 2436 1968 S 0.3 0.2 0:00.26 sshd
7244 root 16 0 1964 976 772 R 0.3 0.1 0:00.45 top
1 root 16 0 3116 544 464 S 0.0 0.1 0:00.97 init
2 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
3 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/0
4 root 5 -10 0 0 0 S 0.0 0.0 0:00.03 events/0
5 root 5 -10 0 0 0 S 0.0 0.0 0:00.01 khelper
6 root 5 -10 0 0 0 S 0.0 0.0 0:00.00 kthread
7 root 15 -10 0 0 0 S 0.0 0.0 0:00.00 kacpid
88 root 5 -10 0 0 0 S 0.0 0.0 0:00.01 kblockd/0
89 root 15 0 0 0 0 S 0.0 0.0 0:00.00 khubd
106 root 20 0 0 0 0 S 0.0 0.0 0:00.00 pdflush
107 root 15 0 0 0 0 S 0.0 0.0 0:00.18 pdflush
108 root 25 0 0 0 0 S 0.0 0.0 0:00.00 kswapd0
109 root 6 -10 0 0 0 S 0.0 0.0 0:00.00 aio/0
255 root 25 0 0 0 0 S 0.0 0.0 0:00.00 kseriod
常用选项:
d : 指定刷新的时间间隔
c : 显示整个命令而不仅仅显示命令名
在命令运行的时候按键盘d,会出现如下提示要求你输入刷新的间隔时间
Change delay from 3.0 to: 10(秒)
常用命令:
u : 查看指定用户的进程
k : 终止执行中的进程
h or ? 获得帮助
r: 重新设定进程优先级
s: 改变刷新的时间间隔
W: 将当前设置写入~/.toprc文件中
这里不细讲了,感兴趣的可以用 man top 命令查看top的详细帮助。
为什么要计划任务
为什么要设置计划任务
我们在系统的管理中,很多时候不是及时的去操作,比如对某一网站数据的备份,备份的过程需要占用大量的系统资源,凌晨三四点的时候系统访问用户最少,系统最空闲。但我们的系统的系统管理员总不能老那个时间爬起来操作吧。如果在家远程操作的话,老婆不愿意了。哈哈!
计划任务的命令
计划命令分一次性计划和周期性计划。比如我要在今年10月1结婚,这是一次性的计划。不能每年的10月1结婚吧,真有女女愿意结,咱经济上也吃不消呀。睡觉就是周期性的计划。比如,我给自己规定每天晚上的11点半睡觉。那么到时间我就上床睡觉。
at 安排作业在某一时刻执行一次
batch 安排作业在系统负载不重时执行一次
cron 安排周期性运行的作业
一次性计划at和batch
at命令指定时间的方式
绝对计时方法:
midnight noon teatime
hh:mm [today]
hh:mm tomorrow
hh:mm 星期
hh:mm MM/DD/YY
相对计时方法:
now+n minutes
mow+n hours
now+n days
用法:
指定在今天下午17:30执行某命令(假设现在时间是下午14:30,2012年1月11日)
命令格式:
at 5:30pm
at 17:30
at 17:20 today
at now+3 hours
at now+180 minutes
at 17:30 12.1.11
at 17:30 1.11.12
好!现格式知道了,玩个实例吧!
[[email protected] ~]# at now+5 minutes
at>
我们定的时间是5分钟之后,现在可以在at下面输入各种任务,保存!5分钟之后执行;不过,我们需要注意,在用命令时最好写命令的绝对路径,为了安全。
[[email protected] ~]# at now+5 minutes
at> /usr/bin/wall < /etc/motd 做一个广播,把etc/motd 文件广播出去
at> 可以继续写其它的计划
at>
job 2 at 2012-05-20 13:43 ctrl+d保存计划并退出
是否还担心我们的计划是否启动,通过下面两个命令查看at进程是否正常启动
[[email protected] test]# at -l
3 2012-05-20 13:57 a root
[[email protected] test]# atq
3 2012-05-20 13:57 a root
如果真的没有启动的话,可以通过手工方式重新启动一下
[[email protected] ~]# /etc/rc.d/init.d/atd start
删除at计划任务
[[email protected] test]# at -d
查看at计划任务
[[email protected] test]# ls /var/spool/at/
batch命令
作用:
安排一个或多个命令在系统负载较轻进运行一次(一般情况下负载较轻指平均负载降到0.8以下)
使用方法同at
周期性计划命令crontab
作用:用于生成cron进程所需要的crontab文件
crontab的命令格式
crontab {-l|-r|-e}
-l 显示当前的crontab
-r 删除当前的crontab
-e 使用编辑器编辑当前crontab文件
好多人都觉得周期计划任务设置起来比较麻烦,其实我们只要掌握规律就很好设置。
crontab -e
规则: 把知道的具体的时间添上,不知道的都添加上*
分钟 小时 天 月 星期 命令/脚本
假如,我们每天早上4点要做一下操作,以下面方式表示:
分钟 小时 天 月 星期 命令/脚本
- 4 * * * [具体的操作]
假如,我们每周一和三下午的6点要做一下操作,以下面方式表示:
分钟 小时 天 月 星期 命令/脚本
- 18 * * 1,3 [具体的操作]
案例:在上学的时候都有上机课,周一到周五,下午5点30上课结果。我们需要在5点30发一个通知,5点45自动关机。设定计划任务需要分两步完成,第一步提醒,第二步关机
分钟 小时 天 月 星期 命令/脚本
30 17 * * 1-5 /usr/bin/wall < /hzh/test/guanji.wall
45 17 * * 1-5 /usr/bin/shudown -h now
操作方法:
[[email protected] test]# crontab -e 回车会进入一个vi文本中
根据我上面介绍格式编写内容,然后保存退出
crontab: installing new crontab 表示创建计划成功
通过下面方式进行查看计划:
[[email protected] test]# cd /var/spool/cron
[[email protected] cron]# ls
root
[[email protected] cron]# cat root
30 17 * * 1-5 /usr/bin/shudown -h now