Ⅰ linux进程管理及作业控制的启动进程
键入需要运行的程序的程序名,执行一个程序,其实也就是启动了一个进程。在Linux系统中每个进程都具有一个进程号,用于系统识别和调度进程。启动一个进程有两个主要途径:手工启动和调度启动,后者是事先进行设置,根据用户要求自行启动。 由用户输入命令,直接启动一个进程便是手工启动进程。但手工启动进程又可以分为很多种,根据启动的进程类型不同、性质不同,实际结果也不一样,下面分别介绍。1. 前台启动这或许是手工启动一个进程的最常用的方式。一般地,用户键入一个命令“ls –l”,这就已经启动了一个进程,而且是一个前台的进程。这时候系统其实已经处于一个多进程状态。或许有些用户会疑惑:我只启动了一个进程而已。但实际上有许多运行在后台的、系统启动时就已经自动启动的进程正在悄悄运行着。还有的用户在键入“ls –l”命令以后赶紧使用“ps –x”查看,却没有看到ls进程,也觉得很奇怪。其实这是因为ls这个进程结束太快,使用ps查看时该进程已经执行结束了。如果启动一个比较耗时的进程:find / -name fox.jpg然后再把该进程挂起,使用ps查看,就会看到一个find进程在里面。2. 后台启动直接从后台手工启动一个进程用得比较少一些,除非是该进程甚为耗时,且用户也不急着需要结果的时候。假设用户要启动一个需要长时间运行的格式化文本文件的进程。为了不使整个shell在格式化过程中都处于“瘫痪”状态,从后台启动这个进程是明智的选择。[例1]$ troff –me notes > note_form &[1] 4513$由上例可见,从后台启动进程其实就是在命令结尾加上一个&号。键入命令以后,出现一个数字,这个数字就是该进程的编号,也称为PID,然后就出现了提示符。用户可以继续其他工作。上面介绍了前、后台启动的两种情况。实际上这两种启动方式有个共同的特点,就是新进程都是由当前shell这个进程产生的。也就是说,是shell创建了新进程,于是就称这种关系为进程间的父子关系。这里shell是父进程,而新进程是子进程。一个父进程可以有多个子进程,一般地,子进程结束后才能继续父进程;当然如果是从后台启动,那就不用等待子进程结束了。一种比较特殊的情况是在使用管道符的时候。例如:nroff -man ps.1|grep kill|more这时候实际上是同时启动了三个进程。请注意是同时启动的,所有放在管道两边的进程都将被同时启动,它们都是当前shell的子程序,互相之间可以称为兄弟进程。以上介绍的是手工启动进程的一些内容,作为一名系统管理员,很多时候都需要把事情安排好以后让其自动运行。因为管理员不是机器,也有离开的时候,所以有些必须要做的工作而恰好管理员不能亲自操作,这时候就需要使用调度启动进程了。 有时候需要对系统进行一些比较费时而且占用资源的维护工作,这些工作适合在深夜进行,这时候用户就可以事先进行调度安排,指定任务运行的时间或者场合,到时候系统会自动完成这一切工作。要使用自动启动进程的功能,就需要掌握以下几个启动命令。at命令 用户使用at命令在指定时刻执行指定的命令序列。也就是说,该命令至少需要指定一个命令、一个执行时间才可以正常运行。at命令可以只指定时间,也可以时间和日期一起指定。需要注意的是,指定时间有个系统判别问题。比如说:用户现在指定了一个执行时间:凌晨3:20,而发出at命令的时间是头天晚上的20:00,那么究竟是在哪一天执行该命令呢?如果用户在3:20以前仍然在工作,那么该命令将在这个时候完成;如果用户3:20以前就退出了工作状态,那么该命令将在第二天凌晨才得到执行。下面是at命令的语法格式:at [-V] [-q 队列] [-f 文件名] [-mldbv] 时间at -c 作业 [作业…]at允许使用一套相当复杂的指定时间的方法,实际上是将POSIX.2标准扩展了。它可以接受在当天的hh:mm(小时:分钟)式的时间指定。如果该时间已经过去,那么就放在第二天执行。当然也可以使用midnight(深夜),noon(中午),teatime(饮茶时间,一般是下午4点)等比较模糊的词语来指定时间。用户还可以采用12小时计时制,即在时间后面加上AM(上午)或者PM(下午)来说明是上午还是下午。也可以指定命令执行的具体日期,指定格式为month day(月 日)或者mm/dd/yy(月/日/年)或者dd.mm.yy(日.月.年)。指定的日期必须跟在指定时间的后面。上面介绍的都是绝对计时法,其实还可以使用相对计时法,这对于安排不久就要执行的命令是很有好处的。指定格式为:now + count time-units ,now就是当前时间,time-units是时间单位,这里可以是 minutes(分钟)、hours(小时)、days(天)、weeks(星期)。count是时间的数量,究竟是几天,还是几小时,等等。还有一种计时方法就是直接使用today(今天)、tomorrow(明天)来指定完成命令的时间。下面通过一些例子来说明具体用法。[例2] 指定在今天下午5:30执行某命令。假设现在时间是中午12:30,1999年2月24日,其命令格式如下:at 5:30pmat 17:30at 17:30 todayat now + 5 hoursat now + 300 minutesat 17:30 24.2.99at 17:30 2/24/99at 17:30 Feb 24以上这些命令表达的意义是完全一样的,所以在安排时间的时候完全可以根据个人喜好和具体情况自由选择。一般采用绝对时间的24小时计时法可以避免由于用户自己的疏忽造成计时错误的情况发生,例如上例可以写成:at 17:30 2/24/99这样非常清楚,而且别人也看得懂。对于at命令来说,需要定时执行的命令是从标准输入或者使用-f选项指定的文件中读取并执行的。如果at命令是从一个使用su命令切换到用户shell中执行的,那么当前用户被认为是执行用户,所有的错误和输出结果都会送给这个用户。但是如果有邮件送出的话,收到邮件的将是原来的用户,也就是登录时shell的所有者。[例3]$ at -f work 4pm + 3 days在三天后下午4点执行文件work中的作业。$ at -f work 10am Jul 31在7月31日上午10点执行文件work中的作业。在任何情况下,超级用户都可以使用这个命令。对于其他用户来说,是否可以使用就取决于两个文件:/etc/at.allow和/etc/at.deny。如果/etc/at.allow文件存在的话,那么只有在其中列出的用户才可以使用at命令;如果该文件不存在,那么将检查/etc/at.deny文件是否存在,在这个文件中列出的用户均不能使用该命令。如果两个文件都不存在,那么只有超级用户可以使用该命令;空的/etc/at.deny文件意味着所有的用户都可以使用该命令,这也是默认状态。下面对命令中的参数进行说明。-V 将标准版本号打印到标准错误中。-q queue 使用指定的队列。队列名称是由单个字母组成,合法的队列名可以由a-z或者A-Z。a队列是at命令的默认队列。-m 作业结束后发送邮件给执行at命令的用户。-f file 使用该选项将使命令从指定的file读取,而不是从标准输入读取。-l atq命令的一个别名。该命令用于查看安排的作业序列,它将列出用户排在队列中的作业,如果是超级用户,则列出队列中的所有工作。命令的语法格式如下:atq [-V] [-q 队列] [-v]-d atrm 命令的一个别名。该命令用于删除指定要执行的命令序列,语法格式如下:atrm [-V] 作业 [作业…]-c 将命令行上所列的作业送到标准输出。[例4] 找出系统中所有以txt为后缀名的文件,并且进行打印。打印结束后给用户foxy发出邮件通知取件。指定时间为十二月二十五日凌晨两点。首先键入:$ at 2:00 12/25/99然后系统出现at>提示符,等待用户输入进一步的信息,也就是需要执行的命令序列:at> find / -name “*.txt”|lprat> echo “foxy:All texts have been printed.You can take them over.Good day!River” |mail -s ”job done” foxy输入完每一行指令然后回车,所有指令序列输入完毕后,使用组合键结束at命令的输入。这时候屏幕将出现如下信息:warning:command will be executed using /bin/sh.job 1 at 1999-12-25 02:00提醒用户将使用哪个shell来执行该命令序列。 实际上如果命令序列较长或者经常被执行的时候,一般都采用将该序列写到一个文件中,然后将文件作为at命令的输入来处理。这样不容易出错。例5] 上面的例子可以修改如下:将命令序列写入到文件/tmp/printjob,语句为:$ at -f /tmp/printjob 2:00 12/25/99这样一来,at命令将使用文件中的命令序列,屏幕显示如下:Warning:command will be executed using /bin/sh.job 2 at 1999-12-25 02:00当然也可以采用以下命令:$ at< /tmp/printjob 2:00 12/25/99来完成同样的任务。也就是使用输入重定向的办法将文件定向为命令输入。batch命令batch 用低优先级运行作业,该命令几乎和at命令的功能完全相同,唯一的区别在于,at命令是在指定时间,很精确的时刻执行指定命令;而batch却是在系统负载较低,资源比较空闲的时候执行命令。该命令适合于执行占用资源较多的命令。batch命令的语法格式也和at命令十分相似,即batch [-V] [-q 队列] [-f 文件名] [-mv] [时间]具体的参数解释请参考at命令。一般地说,不用为batch命令指定时间参数,因为batch本身的特点就是由系统决定执行任务的时间,如果用户再指定一个时间,就失去了本来的意义。[例6] 使用例4,键入:$ batchat> find / -name *.txt|lprat> echo “foxy:All texts have been printed.You can take them over.Good day!River” |mail -s ”job done” foxy现在这个命令就会在合适的时间进行了,进行完后会发回一个信息。仍然使用组合键来结束命令输入。而且batch和at命令都将自动转入后台,所以启动的时候也不需要加上&符号。cron命令前面介绍的两条命令都会在一定时间内完成一定任务,但是要注意它们都只能执行一次。也就是说,当指定了运行命令后,系统在指定时间完成任务,一切就结束了。但是在很多时候需要不断重复一些命令,比如:某公司每周一自动向员工报告头一周公司的活动情况,这时候就需要使用cron命令来完成任务了。实际上,cron命令是不应该手工启动的。cron命令在系统启动时就由一个shell脚本自动启动,进入后台(所以不需要使用&符号)。一般的用户没有运行该命令的权限,虽然超级用户可以手工启动cron,不过还是建议将其放到shell脚本中由系统自行启动。首先cron命令会搜索/var/spool/cron目录,寻找以/etc/passwd文件中的用户名命名的crontab文件,被找到的这种文件将载入内存。例如一个用户名为foxy的用户,它所对应的crontab文件就应该是/var/spool/cron/foxy。也就是说,以该用户命名的crontab文件存放在/var/spool/cron目录下面。cron命令还将搜索/etc/crontab文件,这个文件是用不同的格式写成的。cron启动以后,它将首先检查是否有用户设置了crontab文件,如果没有就转入“休眠”状态,释放系统资源。所以该后台进程占用资源极少。它每分钟“醒”过来一次,查看当前是否有需要运行的命令。命令执行结束后,任何输出都将作为邮件发送给crontab的所有者,或者是/etc/crontab文件中MAILTO环境变量中指定的用户。上面简单介绍了一些cron的工作原理,但是cron命令的执行不需要用户干涉;需要用户修改的是crontab中要执行的命令序列,所以下面介绍crontab命令。crontab命令crontab命令用于安装、删除或者列出用于驱动cron后台进程的表格。也就是说,用户把需要执行的命令序列放到crontab文件中以获得执行。每个用户都可以有自己的crontab文件。下面就来看看如何创建一个crontab文件。在/var/spool/cron下的crontab文件不可以直接创建或者直接修改。crontab文件是通过crontab命令得到的。现在假设有个用户名为foxy,需要创建自己的一个crontab文件。首先可以使用任何文本编辑器建立一个新文件,然后向其中写入需要运行的命令和要定期执行的时间。然后存盘退出。假设该文件为/tmp/test.cron。再后就是使用crontab命令来安装这个文件,使之成为该用户的crontab文件。键入:crontab test.cron这样一个crontab 文件就建立好了。可以转到/var/spool/cron目录下面查看,发现多了一个foxy文件。这个文件就是所需的crontab 文件。用more命令查看该文件的内容可以发现文件头有三行信息:#DO NOT EDIT THIS FILE -edit the master and reinstall.#(test.cron installed on Mon Feb 22 14:20:20 1999)#(cron version –$Id:crontab.c,v 2.13 1994/01/17 03:20:37 vivie Exp $)大概意思是:#切勿编辑此文件——如果需要改变请编辑源文件然后重新安装。#test.cron文件安装时间:14:20:20 02/22/1999如果需要改变其中的命令内容时,还是需要重新编辑原来的文件,然后再使用crontab命令安装。可以使用crontab命令的用户是有限制的。如果/etc/cron.allow文件存在,那么只有其中列出的用户才能使用该命令;如果该文件不存在但cron.deny文件存在,那么只有未列在该文件中的用户才能使用crontab命令;如果两个文件都不存在,那就取决于一些参数的设置,可能是只允许超级用户使用该命令,也可能是所有用户都可以使用该命令。crontab命令的语法格式如下:crontab [-u user] filecrontab [-u user]{-l|-r|-e}第一种格式用于安装一个新的crontab 文件,安装来源就是file所指的文件,如果使用“-”符号作为文件名,那就意味着使用标准输入作为安装来源。-u 如果使用该选项,也就是指定了是哪个具体用户的crontab 文件将被修改。如果不指定该选项,crontab 将默认是操作者本人的crontab ,也就是执行该crontab 命令的用户的crontab 文件将被修改。但是请注意,如果使用了su命令再使用crontab 命令很可能就会出现混乱的情况。所以如果是使用了su命令,最好使用-u选项来指定究竟是哪个用户的crontab文件。-l 在标准输出上显示当前的crontab。-r 删除当前的crontab文件。-e 使用VISUAL或者EDITOR环境变量所指的编辑器编辑当前的crontab文件。当结束编辑离开时,编辑后的文件将自动安装。[例7]# crontab -l #列出用户目前的crontab。10 6 * * * date0 */2 * * * date0 23-7/2,8 * * * date#在crontab文件中如何输入需要执行的命令和时间。该文件中每行都包括六个域,其中前五个域是指定命令被执行的时间,最后一个域是要被执行的命令。每个域之间使用空格或者制表符分隔。格式如下:minute hour day-of-month month-of-year day-of-week commands第一项是分钟,第二项是小时,第三项是一个月的第几天,第四项是一年的第几个月,第五项是一周的星期几,第六项是要执行的命令。这些项都不能为空,必须填入。如果用户不需要指定其中的几项,那么可以使用*代替。因为*是统配符,可以代替任何字符,所以就可以认为是任何时间,也就是该项被忽略了。在表4-1中给出了每项的合法范围。表4-1指定时间的合法范围时间合法值minute 00-59hour 00-23,其中00点就是晚上12点day-of-month01-31month-of-year01-12day-of-week0-6,其中周日是0这样用户就可以往crontab 文件中写入无限多的行以完成无限多的命令。命令域中可以写入所有可以在命令行写入的命令和符号,其他所有时间域都支持列举,也就是域中可以写入很多的时间值,只要满足这些时间值中的任何一个都执行命令,每两个时间值中间使用逗号分隔。[例8]5,15,25,35,45,55 16,17,18 * * * command这就是表示任意天任意月,其实就是每天的下午4点、5点、6点的5 min、15 min、25 min、35 min、45 min、55 min时执行命令。[例9]在每周一,三,五的下午3:00系统进入维护状态,重新启动系统。那么在crontab 文件中就应该写入如下字段:00 15 * * 1,3,5 shutdown -r +5然后将该文件存盘为foxy.cron,再键入crontab foxy.cron安装该文件。[例10]每小时的10分,40分执行用户目录下的innd/bbslin这个指令:10,40 * * * * innd/bbslink[例11]每小时的1分执行用户目录下的bin/account这个指令:1 * * * * bin/account[例12]每天早晨三点二十分执行用户目录下如下所示的两个指令(每个指令以;分隔):20 3 * * * (/bin/rm -f expire.ls logins.bad;bin/expire>expire.1st)[例13]每年的一月和四月,4号到9号的3点12分和3点55分执行/bin/rm -f expire.1st这个指令,并把结果添加在mm.txt这个文件之后(mm.txt文件位于用户自己的目录位置)。12,55 3 4-9 1,4 * /bin/rm -f expire.1st>> m.txt[例14]我们来看一个超级用户的crontab文件:#Run the ‘atrun’ program every minutes#This runs anything that’s e to run from ‘at’.See man ‘at’ or ‘atrun’. 0,5,10,15,20,25,30,35,40,45,50,55 * * * * /usr/lib/atrun40 7 * * * updatedb8,10,22,30,39,46,54,58 * * * * /bin/sync进程的挂起及恢复命令bg、fg作业控制允许将进程挂起并可以在需要时恢复进程的运行,被挂起的作业恢复后将从中止处开始继续运行。只要在键盘上按,即可挂起当前的前台作业。[例15]$ cat >< ctrl+z>text.file [1] + stopped cat > text.file$ jobs [1]+ stopped cat >text.file在键盘上按后,将挂起当前执行的命令cat。使用jobs命令可以显示shell的作业清单,包括具体的作业、作业号以及作业当前所处的状态。恢复进程执行时,有两种选择:用fg命令将挂起的作业放回到前台执行;用bg命令将挂起的作业放到后台执行。[例16]用户正在使用Emacs,突然需要查看系统进程情况。就首先使用组合键将Emacs进程挂起,然后使用bg命令将其在后台启动,这样就得到了前台的操作控制权,接着键入“ps –x”查看进程情况。查看完毕后,使用fg命令将Emacs带回前台运行即可。其命令格式为:< ctrl+z>$ bg emacs$ ps –x$ fg emacs默认情况下,fg和bg命令对最近停止的作业进行操作。如果希望恢复其他作业的运行,可以在命令中指定要恢复作业的作业号来恢复该作业。例如:$ fg 1cat > text.file灵活使用上述命令,将给自己带来很大的方便。
Ⅱ linux centos 7 下用yum 安装iso镜像里自带的php5.4.16版本的但是没有php-fqm文件不知道怎么重启php服务
systemctl restart php-fpm.service #这条命令是重启php服务下面是一个比较靠谱的php安装步骤:先删除已有的php版本 ,执行下面的命令删除phpyum remove php-common然后像安装那样问你是否继续的,输入yes即可添加 yum 源CentOS 6.x 的源# rpm -Uvh http://download.Fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm# rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm安装 PHP# yum install –enablerepo=remi,remi-php56 php php-opcache php-pecl-apcu php-devel php-mbstring php-mcrypt php-mysqlnd php-phpunit-PHPUnit php-pecl-xdebug php-pecl-xhprof php-pdo php-pear php-fpm php-cli php-xml php-bcmath php-process php-gd php-common注:安装5.6版本为remi-php56,安装5.5版本为remi-php55
Ⅲ linux有哪些系列
主流的Linux发行版:Asianux , Linux ,Conectiva Linux ,Debian GNU/Linux ,Fedora Core ,Gentoo Linux ,Knoppix Linux ,Linux From Scratch ,Magic Linux ,Mandriva Linux ,Red Hat Linux ,Slackware Linux ,Stanix Live CD ,SUSE Linux ,Turbo Linux ,Ubuntu Linux中国大陆的Linux发行版:红旗Linux(Redflag Linux) ,冲浪Linux(Xteam Linux) ,蓝点Linux ,Hiweed GNU/Linux ,Magic Linux ,Engineering Computing GNU/Linux ,Open Desktop ,新华Linux ,共创Linux ,百资Linux ,中标普华Linux ,中软Linux ,新华华镭Linux(RaysLX) ,CD Linux ,MC Linux ,即时Linux(Thizlinux) ,b2d linux ,IBOX ,MCLOS ,FANX,Everest,酷博linux台湾地区的Linux发行版:鸿奇Linux目前最著名的发行版本:Debian,红帽(redhat)、ubuntu、Suse、Open Suse、Mandriva(原Mandrake)、CentOS、fedora等国内比较著名的linux版本:红旗linux
Ⅳ linux kernel 没有输出信息 怎么调试
最近工作在调试usb虚拟串口,让其作为kernel启动的调试串口,以及user空间的输入输出控制台。利用这个机会,学习下printk如何选择往哪个console输出以及user空间下控制台如何选择,记录与此,与大家共享,也方便自己以后翻阅。Kernel版本号:3.4.55依照我的思路(还是时间顺序)分了4部分,指定kernel调试console , kernel下printk console的选择 ,kernel下console的注册,user空间console的选择。一 指定kernel调试console首先看kernel启动时如何获取和处理指定的console参数。kernel的启动参数cmdline可以指定调试console,如指定‘console=ttyS0,115200’,kernel如何解析cmdline,我之前写了一篇博文如下:http://blog.csdn.net/skyflying2012/article/details/41142801根据之前的分析,cmdline中有console=xxx,start_kernel中parse_args遍历.init.setup段所有obs_kernel_param。kernel/printk.c中注册了‘console=’的解析函数console_setup(注册了obs_kernel_param),所以匹配成功,会调用console_setup来解析,如下:[cpp] view plain static int __init console_setup(char *str) { char buf[sizeof(console_cmdline[0].name) + 4]; /* 4 for index */ char *s, *options, *brl_options = NULL; int idx; #ifdef CONFIG_A11Y_BRAILLE_CONSOLE if (!memcmp(str, "brl,", 4)) { brl_options = ""; str += 4; } else if (!memcmp(str, "brl=", 4)) { brl_options = str + 4; str = strchr(brl_options, ','); if (!str) { printk(KERN_ERR "need port name after brl=\n"); return 1; } *(str++) = 0; } #endif /* * Decode str into name, index, options. */ if (str[0] >= '0' && str[0] <= '9') { strcpy(buf, "ttyS"); strncpy(buf + 4, str, sizeof(buf) – 5); } else { strncpy(buf, str, sizeof(buf) – 1); } buf[sizeof(buf) – 1] = 0; if ((options = strchr(str, ',')) != NULL) *(options++) = 0; #ifdef __sparc__ if (!strcmp(str, "ttya")) strcpy(buf, "ttyS0"); if (!strcmp(str, "ttyb")) strcpy(buf, "ttyS1"); #endif for (s = buf; *s; s++) if ((*s >= '0' && *s <= '9') || *s == ',') break; idx = simple_strtoul(s, NULL, 10); *s = 0; __add_preferred_console(buf, idx, options, brl_options); console_set_on_cmdline = 1; return 1; } __setup("console=", console_setup); 参数是console=的值字符串,如“ttyS0,115200”,console_setup对console=参数值做解析,以ttyS0,115200为例,最后buf=“ttyS”,idx=0,options="115200",brl_options=NULL。调用__add_preferred_console如下:[cpp] view plain /* * If exclusive_console is non-NULL then only this console is to be printed to. */ static struct console *exclusive_console; /* * Array of consoles built from command line options (console=) */ struct console_cmdline { char name[8]; /* Name of the driver */ int index; /* Minor dev. to use */ char *options; /* Options for the driver */ #ifdef CONFIG_A11Y_BRAILLE_CONSOLE char *brl_options; /* Options for braille driver */ #endif }; #define MAX_CMDLINECONSOLES 8 static struct console_cmdline console_cmdline[MAX_CMDLINECONSOLES]; static int selected_console = -1; static int preferred_console = -1; int console_set_on_cmdline; EXPORT_SYMBOL(console_set_on_cmdline); static int __add_preferred_console(char *name, int idx, char *options, char *brl_options) { struct console_cmdline *c; int i; /* * See if this tty is not yet registered, and * if we have a slot free. */ for (i = 0; i < MAX_CMDLINECONSOLES && console_cmdline[i].name[0]; i++) if (strcmp(console_cmdline[i].name, name) == 0 && console_cmdline[i].index == idx) { if (!brl_options) selected_console = i; return 0; } if (i == MAX_CMDLINECONSOLES) return -E2BIG; if (!brl_options) selected_console = i; c = &console_cmdline[i]; strlcpy(c->name, name, sizeof(c->name)); c->options = options; #ifdef CONFIG_A11Y_BRAILLE_CONSOLE c->brl_options = brl_options; #endif c->index = idx; return 0; } kernel利用结构体数组console_cmdline[8],最多可支持8个cmdline传入的console参数。__add_preferred_console将name idx options保存到数组下一个成员console_cmdline结构体中,如果数组中已有重名,则不添加,并置selected_console为最新添加的console_cmdline的下标号。比如cmdline中有“console=ttyS0,115200 console=ttyS1,9600”则在console_cmdline[8]数组中console_cmdline[0]代表ttyS0,console_cmdline[1]代表ttyS1,而selected_console=1.二 kernel下printk console的选择kernel下调试信息是通过printk输出,如果要kernel正常打印,则需要搞明白printk怎么选择输出的设备。关于printk的实现原理,我在刚工作的时候写过一篇博文,kernel版本是2.6.21的,但是原理还是一致的,可供参考:http://blog.csdn.net/skyflying2012/article/details/7970341printk首先将输出内容添加到一个kernel缓冲区中,叫log_buf,log_buf相关代码如下:[cpp] view plain #define MAX_CMDLINECONSOLES 8 static struct console_cmdline console_cmdline[MAX_CMDLINECONSOLES]; static int selected_console = -1; static int preferred_console = -1; int console_set_on_cmdline; EXPORT_SYMBOL(console_set_on_cmdline); /* Flag: console code may call schele() */ static int console_may_schele; #ifdef CONFIG_PRINTK static char __log_buf[__LOG_BUF_LEN]; static char *log_buf = __log_buf; static int log_buf_len = __LOG_BUF_LEN; static unsigned logged_chars; /* Number of chars proced since last read+clear operation */ static int saved_console_loglevel = -1; log_buf的大小由kernel menuconfig配置,我配置的CONFIG_LOG_BUF_SHIFT为17,则log_buf为128k。printk内容会一直存在log_buf中,log_buf满了之后则会从头在开始存,覆盖掉原来的数据。根据printk的实现原理,printk最后调用console_unlock实现log_buf数据刷出到指定设备。这里先不关心printk如何处理log buf数据(比如添加内容级别),只关心printk如何一步步找到指定的输出设备,根据printk.c代码,可以找到如下线索。printk->vprintk->console_unlock->call_console_drivers->_call_console_drivers->_call_console_drivers->__call_console_drivers看线索最底层__call_console_drivers代码。如下:[cpp] view plain /* * Call the console drivers on a range of log_buf */ static void __call_console_drivers(unsigned start, unsigned end) { struct console *con; for_each_console(con) { if (exclusive_console && con != exclusive_console) continue; if ((con->flags & CON_ENABLED) && con->write && (cpu_online(smp_processor_id()) || (con->flags & CON_ANYTIME))) con->write(con, &LOG_BUF(start), end – start); } } for_each_console定义如下:[cpp] view plain /* * for_each_console() allows you to iterate on each console */ #define for_each_console(con) \ for (con = console_drivers; con != NULL; con = con->next) 遍历console_drivers链表所有console struct,如果有exclusive_console,则调用与exclusive_console一致console的write,如果exclusive_console为NULL,则调用所有ENABLE的console的write方法将log buf中start到end的内容发出。可以看出,execlusive_console来指定printk输出唯一console,如果未指定,则向所有enable的console写。默认情况下execlusive_console=NULL,所以printk默认是向所有enable的console写!只有一种情况是指定execlusive_console,就是在console注册时,下面会讲到。到这里就很明了了,kernel下每次printk打印,首先存log_buf,然后遍历console_drivers,找到合适console(execlusive_console或所有enable的),刷出log。console_drivers链表的成员是哪里来的,谁会指定execulsive_console?接着来看下一部分,kernel下console的注册
Ⅳ linux操作系统的版本介绍
linux操作系统的版本介绍 Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。下面是我收集的关于linux操作系统的版本,希望大家认真阅读! debian一般是非商业和非政府部门的民间服务器使用 外面的轮森公司一般用redhat企业版,即RHEL(RedhatEnterpriseLinux)和CentOS(Community ENTerprise Operating System) Cent OS来自于Red Hat Enterprise Linux依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定性的服务器以CentOS替代商业版的Red Hat Enterprise Linux使用。两者的`不同,在于CentOS并不包含封闭源代码软件。 1.redhat 毕竟是主流的服务器级别雹胡的linux版本。最重要的是提供各种专业的技术支持,提供大的技术和产品解决方案。拥有唯一的全球linux专业技术认证机构。很多国企和大中型企业中的大型服务器会首选红帽。 2.Centos 其实就是redhat换了个商标而已,相对于redhat基本上没有区别,好处就是完全免费,坏处是不提供任何技术支持。中小企业的一些标准服务器系统经常采用。 3.ubuntu 个人系统方面的做的相当优秀,尤其是丰富的资源库和领先的图形界面的设计。不过作为服务器端目前用的还是不太多。 各大互联网公司应用比较多的还是 Centos , fedora ,redhat 而大型企业用来做数据中心的话,估计ubuntu server份额现在还不行,ubuntu server需要向这些企业证明自己,等待这些企业的评估。 目前企业数据中心服务器这一块,redhat和suse占了90%,suse一直在下降,redhat是大佬。 oracle linux也发力了,centOS不具备redhat特有的优势,甚至后发潜力不如SL。redhat就是服务做得比较到位,产品比较稳定,而那些大公司愿意花这些钱来得到服务。linux下服务器赚的钱基本上是radhat拿了大多数。 ubuntu server上升势头比较猛,希望以12.04lts为契机,能有大的发展。想想windows server,系统本身稳定性和可靠性等方面不如linux,但为啥在pc服务器市场上却占大头,就是相关的一站式服务和相关配套软件做得好,毕竟很多人包括公司怕麻烦,愿意出钱去享受这些便源桐拦利。 所以redhat能脱颖而出就再自然不过了,ubuntu server很有希望成第二个redhat。 ;
Ⅵ 如何检查Linux上的glibc版本
1、首先连来接上Linux主机,如图自所示,使Linux主机处于一个命令状态。
Ⅶ linux怎么安装配置snmp协议
一、安装
snmp
服务
1
、检查系统是否已经安装
snmp
的
rpm
包
以下是安装
snmp
服务需要的
rpm
包:
libsensors3-2.10.6-55.el5.i386.rpm
lm_sensors-2.10.6-55.el5.i386.rpm
net-snmp-libs-5.3.2.2-5.el5.i386.rpm
net-snmp-5.3.2.2-5.el5.i386.rpm
net-snmp-utils-5.3.2.2-5.el5.i386.rpm
推荐到
http://rpm.pbone.net/
下载这些
rpm
包,该网站比较全面,包含各种版本的包。
使用命令:
$rpm-qa|grepsnmp
检查是否安装
net-snmp-utils-5.3.2.2-5.el5
,
net-snmp-libs-5.3.2.2-5.el5
,
net-snmp-5.3.2.2-5.el5
三个
rpm
包
使用命令:
$rpm-qa|greplibsen
检查是否安装
libsensors3-2.10.6-55.el5
使用命令:
$rpm-qa|greplm
检查是否安装
lm_sensors-2.10.6-55.el5
说明:
(
1
)这几个包的安装有一定顺序,在安装的时候,会有提示。比如安装
net-snmp-5.3.2.2-5.el5.i386.rpm
时,会提示必须先安装
net-snmp-libs-5.3.2.2-5.el5.i386.rpm
。
(
2
)
net-snmp-utils-5.3.2.2-5.el5.i386.rpm
并不是必须安装的包,但安装它会带来不少帮助,
它提供了很多工具,
例如可以使用
snmptranslate
命令查看
oid
,
可以使用
snmpget
、
snmpwalk
命令等。
(
3
)
net-snmp-libs-5.3.2.2-5.el5.i386.rpm
、
net-snmp-5.3.2.2-5.el5.i386.rpm
、
net-snmp-utils-5.3.2.2-5.el5.i386.rpm
这三个包有一定的版本要求,必须版本一致,否则安装
无法成功。我这里都使用的
5.3.2.2-5.el5
版本,也可以下载其他版本的
rpm
包,但注意版本
要一致,在安装的时候也会提示,哪个版本的包是必须的,你可以根据提示下载需要的包。
2
、安装以上的几个
rpm
包
若系统中没有安装以上包,则先安装。
使用命令:
rpm–ivh
包名
安装完后,使用命令:
$rpm-qa|grepsnmp
,检查是否已经安装成功。
3
、启动
snmp
服务
若安装成功,则可使用命令:
$servicesnmpdstart
提示:
Starting
snmpd:
[OK]
,则启动
snmp
服务成功。
你可以将
snmp
服务设置为开机自启动,这样免去手动启动的麻烦。
使用命令:
$chkconfigsnmpdon
,将
snmpd
服务设为开机自启动。
然后使用命令:
$chkconfig–list|grepsnmpd
,查看是否已经设置成功。
4
、验证
snmp
服务
(
1
)使用
snmpwalk
命令,查看本机
localhost
的主机名:
如上,可以看到通过远端主机获取到的主机名,与在本机获取到的主机名是一致的。
二、配置
snmp
服务
以上安装完成后,使用的是
snmp
的默认配置,通过这些默认配置,我们只能获取主机的部
分信息。但一些其他的重要信息,无法获取。如主机的
CPU
使用情况,内存使用情况等。
如上,无法获取
CPU
的空闲率(注:
1.3.6.1.4.1.2021.11.11.0
是主机
CPU
空闲率的
oid
)
。
这时候,若要获取主机的一些重要信息,则要修改
snmp
的默认配置。
配置方法:修改
/etc/snmp/snmpd.conf
文件
1
、修改查看设备节点的权限
在该文件中,找到如下位置:
view
:定义了可以查看哪些节点设备的信息。
snmp
默认配置只能查看
.1.3.6.1.2.1.1
和
.1.3.6.1.2.1.25.1.1
节点下的设备信息,
而主机
CPU
和
内存等设备都不在这些节点下,所以无法获取这些数据。
因此,可以修改这个配置,如下:
在此处添加了一行:
viewsystemviewincluded.1
表示可以查看
.1
节点下的所有设备信息。