天之道,损有余而补不足,是故虚胜实,不足胜有余。
是老子在《道德经》里的话,
天之道,损有余而补不足。人之道,则不然,损不足以奉有余。孰能有余以奉天下?唯有道者。
自然的法则,是损减有余来补充不足。
人类社会世俗的作法却不然,而是损减贫穷不足来供奉富贵有余。
谁能让有余来供奉天下呢?只有有道之人。
因此,圣人有所作为却不自恃己能,有所成就也不居功自傲,他不愿显示自己的贤德。
原:
“天之道其犹张弓与。高者抑之,下者举之。有馀者损之,不足者补之。天之道,损有馀而补不足。人之道,则不然,损不足以奉有馀。孰能有馀以奉天下,唯有道者。”
译:
天道,就像是把弦绷在弓上射箭一样,弦位高了就要压低一些,弦位低了就抬高一些。
多出来的时候,就要加以减损,不足的时候,就要加以补足。天道,是减损有余的,用来补给不足的。但人之道却不是这样,总是减损不足的,用来供给有余的。
有谁能够把有余的拿来补给天下不足的呢,只有能够观天之道,执天之行的道者才能做得到。
所以,开悟的道者不会储藏财物,而是把多余的财物用来帮助别人,他们越这样做,反而越是会拥有财物。越是给予别人,自己反而越多。
道的创造总是利于万物,而不是去伤害它们。开悟的道者无无论做什么事都不会去与人相争。
阅读全文
是老子在《道德经》里的话,
天之道,损有余而补不足。人之道,则不然,损不足以奉有余。孰能有余以奉天下?唯有道者。
自然的法则,是损减有余来补充不足。
人类社会世俗的作法却不然,而是损减贫穷不足来供奉富贵有余。
谁能让有余来供奉天下呢?只有有道之人。
因此,圣人有所作为却不自恃己能,有所成就也不居功自傲,他不愿显示自己的贤德。
原:
“天之道其犹张弓与。高者抑之,下者举之。有馀者损之,不足者补之。天之道,损有馀而补不足。人之道,则不然,损不足以奉有馀。孰能有馀以奉天下,唯有道者。”
译:
天道,就像是把弦绷在弓上射箭一样,弦位高了就要压低一些,弦位低了就抬高一些。
多出来的时候,就要加以减损,不足的时候,就要加以补足。天道,是减损有余的,用来补给不足的。但人之道却不是这样,总是减损不足的,用来供给有余的。
有谁能够把有余的拿来补给天下不足的呢,只有能够观天之道,执天之行的道者才能做得到。
所以,开悟的道者不会储藏财物,而是把多余的财物用来帮助别人,他们越这样做,反而越是会拥有财物。越是给予别人,自己反而越多。
道的创造总是利于万物,而不是去伤害它们。开悟的道者无无论做什么事都不会去与人相争。
阅读全文
孙子曰:夫兵形像水,水之形,避高而趋下;兵之形,避实而击虚。看看,中国人连军事也带水性。水太柔弱了,一滴水,遇到阳光,几秒钟就蒸发怠尽,然而以少聚多,水多至极限,就会泛滥成灾,大江,大河决堤。阅读全文
一、借助睡眠 睡眠与人体免疫力密切相关。著名免疫学家通过“自我睡眠”试验发现,良好的睡眠可使体内的两种淋巴细胞数量明显上升。而医学专家的研究表明,睡眠时人体会产生一种称为胞壁酸的睡眠因子,此因子促使白血球增多,巨噬细胞活跃,肝脏解毒功能增强,从而将侵入的细菌和病毒消灭。
二、保持乐观情绪 乐观的态度可以维持人体于一个最佳的状态,尤其是在现今社会,人们面临的压力很大,巨大的心理压力会导致对人体免疫系统有抑制作用的荷尔蒙成分增多,所以容易受到感冒或其它疾病的侵袭。
三、限制饮酒 每天饮低度白酒不要超过100毫升,黄酒不要超过250毫升,啤酒不要超过1瓶,因为酒精对人体的每一部分都会产生消极影响。即使喝葡萄酒可以降低胆固醇,也应该限制每天一杯,过量饮用会给血液与心脏等器官造成很大破坏。
四、参加运动 专家进行的3项研究指出,每天运动30到45分钟,每周5天,持续12周后,免疫细胞数目会增加,抵抗力也相对增加。运动只要心跳加速即可,晚餐后散步就很适合。
五、补充维生素 每天适当补充维生素和矿物质。专家指出,身体抵抗外来侵害的武器,包括干扰素及各类免疫细胞的数量与活力都和维生素与矿物质有关。
六、改善体内生态环境 用微生态制剂提高免疫力的研究和使用由来已久。研究表明,以肠道双歧杆菌、乳酸杆菌为代表的有益菌群具有广谱的免疫原性,能刺激负责人体免疫的淋巴细胞分裂繁殖,同时还能调动非特异性免疫系统,去“吃”掉包括病毒、细菌、衣原体等在内的各种可致病的外来微生物,产生多种抗体,提高人体免疫能力。对于健康人来说,不妨“食疗”,多吃些乳酸菌饮料;而健康边缘人群,可以用微生态制剂来调节体内微生态平衡。
能提高免疫力的食品
1.灵芝:灵芝可增强人体的免疫力,这是因为灵芝含有抗癌效能的多糖体,此外,还含有丰富的锗元素。锗能加速身体的新陈代谢,延缓细胞的衰老,能通过诱导人体产生干扰素而发挥其抗癌作用;
2.新鲜萝卜:因其含有丰富的干扰素诱导剂而具有免疫作用;
3.人参蜂王浆:能提高机体免疫力及内分泌的调节能力,并含具有防癌作用的蜂乳酸;
4.蘑菇、猴头菇、草菇、黑木耳、银耳、车养、百合等:都有明显增强免疫力的作用;
5.香菇:香菇所含的香菇多糖能增强人体免疫力。
二、保持乐观情绪 乐观的态度可以维持人体于一个最佳的状态,尤其是在现今社会,人们面临的压力很大,巨大的心理压力会导致对人体免疫系统有抑制作用的荷尔蒙成分增多,所以容易受到感冒或其它疾病的侵袭。
三、限制饮酒 每天饮低度白酒不要超过100毫升,黄酒不要超过250毫升,啤酒不要超过1瓶,因为酒精对人体的每一部分都会产生消极影响。即使喝葡萄酒可以降低胆固醇,也应该限制每天一杯,过量饮用会给血液与心脏等器官造成很大破坏。
四、参加运动 专家进行的3项研究指出,每天运动30到45分钟,每周5天,持续12周后,免疫细胞数目会增加,抵抗力也相对增加。运动只要心跳加速即可,晚餐后散步就很适合。
五、补充维生素 每天适当补充维生素和矿物质。专家指出,身体抵抗外来侵害的武器,包括干扰素及各类免疫细胞的数量与活力都和维生素与矿物质有关。
六、改善体内生态环境 用微生态制剂提高免疫力的研究和使用由来已久。研究表明,以肠道双歧杆菌、乳酸杆菌为代表的有益菌群具有广谱的免疫原性,能刺激负责人体免疫的淋巴细胞分裂繁殖,同时还能调动非特异性免疫系统,去“吃”掉包括病毒、细菌、衣原体等在内的各种可致病的外来微生物,产生多种抗体,提高人体免疫能力。对于健康人来说,不妨“食疗”,多吃些乳酸菌饮料;而健康边缘人群,可以用微生态制剂来调节体内微生态平衡。
能提高免疫力的食品
1.灵芝:灵芝可增强人体的免疫力,这是因为灵芝含有抗癌效能的多糖体,此外,还含有丰富的锗元素。锗能加速身体的新陈代谢,延缓细胞的衰老,能通过诱导人体产生干扰素而发挥其抗癌作用;
2.新鲜萝卜:因其含有丰富的干扰素诱导剂而具有免疫作用;
3.人参蜂王浆:能提高机体免疫力及内分泌的调节能力,并含具有防癌作用的蜂乳酸;
4.蘑菇、猴头菇、草菇、黑木耳、银耳、车养、百合等:都有明显增强免疫力的作用;
5.香菇:香菇所含的香菇多糖能增强人体免疫力。
我在用gd库时要用到Linux的字体,但不知道字体库路径,能告诉我吗,多谢,最好列出几种常用的中文字体文件的文件名,大谢!!
cp fonts.ttf /usr/share/fonts/
这一条命令足以??、
下面我说一下我的 TrueType 字体安装方法:
在 /etc/X11/fs/ 目录下有一个 config 文件,打开此文件,你就会看见 "catalogue =" 后面的目录就是 RH7.2 的所有已安装的字体目录.下次你修改这个文件的时候请注意:
1,每个目录行都是以 TAB 键为开头,以","(逗号)为结束;
2,最后一个目录行后无任何符号.
TrueType 字体安装方法一:
1,将 simsun.ttf (或 simsun.ttc, RH7.2 对 ttf 和 ttc 文件都支持)拷贝至 /usr/share/fonts/default/TrueType
2,进入 /etc/rc.d/init.d/ 目录,运行
./xfs restart
或重新启动 linux 就OK啦.
问题:
1,有的文章说要修改XF86Config-4文件,增加"/usr/share/fonts/default/TrueType" 路径和 Load "xtt", 我试过,改不改效果一样.
2,用这种方法可以安装 windows 下的大部份 ttf, ttc 字体如simkai.ttf, simyou.ttf 等,但对有些字体如: simfang.ttf, xfs 无法正确识别字体信息,修改 fonts.dir 和 fonts.scale 也没用,因为RH在启动的时候 xfs 会自动刷新这两个文件.用下面的方法就可以解决这个问题.
TrueType 字体安装方法二:
1,在 /etc/X11/fs/config 文件中字体路径部分插入一行
/usr/X11R6/lib/X11/fonts/TrueType, (请注意格式)
2,运行 /etc/rc.d/init.d/xfs restart 命令后就会发现字体中多了几个以 alias 打头的字体,其实这几个字体和 arphic 打头的字体是一样的.以 arphic 打头的字体是从 /usr/share/fonts/zh_CN/TrueType 和 /usr/share/fonts/zh_TW/TrueType 两个字体目录中来的.
3,自建一个目录,如 /WinTrueType 把你所需要安装的 TrueType 字体全部拷贝到这个目录下
4,进入 /usr/share/fonts/install 目录
# cd /usr/share/fonts/install
运行 ./xttfm.ttfm --add 命令
例如你要安装simsun.ttc字体,那么
# ./xttfm.ttfm --add /WinTrueType/simsun.ttc
# /etc/rc.d/init.d/xfs restart
就会产生 aliasmisc-simsun 和 misc-simsun 两个字体,是一样的.
例如你要安装 simfang.ttf 字体,那么
# ./xttfm.ttfm --add /WinTrueType/simfang.ttf
# /etc/rc.d/init.d/xfs restart
同样也会有 aliasmisc-fangsong_gb2312 和 misc-fangsong_gb2312 两个字体.
5,如果没有 xttfm.ttfm 文件,那么你可能没有安装 ttfm-0.9.1-8.i386.rpm, 在第二张安装盘上.
6,xttfm.ttfm 的使用方法请见 xttfm.ttfm --help
xttfm.ttfm 是一个 shell 脚本,你可以 vi xttfm.ttfm 看一看就明白啦.
注意: xttfm.ttfm 在 /usr/X11R6/lib/X11/fonts/TrueType 目录生成的是一个链接文件.
7,xttfm.ttfm 对 TrueType 字体信息识别很全建议使用这种方法.
为SuSE添加字体
本以为SuSE添加字体会用到ttmkfdir、mkfontdir、mkfontscale这些命令的,可是怎么也找到ttmkfdir,打算装一个,可是google了一下。发现SuSE添加字体远没那么麻烦。只要把要添加的字体copy到相应的truetype目录,运行SuSEconfig- modulefonts即可,要想让新装的字体在当前会话有效,运行xsetfprehash。
注:找了SuSE的官方文档,要把字体文件添加到这个目录下:
/usr/X11R6/lib/X11/fonts/truetype
否则添加的字体只能Root用,别的用户没法用。
<?php //imge5.php
Header("Content-type:image/PNG");
$char=chr(0xE9).chr(0x95).chr(0xBF).chr(0xE6).chr(0xB1).chr(0x9F).chr(0xE5).chr(0xA4).chr(0xA7).chr(0xE5).chr(0xAD).chr(0xA6);
$im=ImageCreate(250,40);
$yellow=ImageColorAllocate($im,241,254,1);
$blue=ImageColorAllocate($im,0,0,255);
ImageTTFText($im,16,0,70,30,$blue,"simkai.ttf",$char);
ImagePNG($im);
ImageDestroy($im);
?>
Header("Content-type:image/PNG");
$char=chr(0xE9).chr(0x95).chr(0xBF).chr(0xE6).chr(0xB1).chr(0x9F).chr(0xE5).chr(0xA4).chr(0xA7).chr(0xE5).chr(0xAD).chr(0xA6);
$im=ImageCreate(250,40);
$yellow=ImageColorAllocate($im,241,254,1);
$blue=ImageColorAllocate($im,0,0,255);
ImageTTFText($im,16,0,70,30,$blue,"simkai.ttf",$char);
ImagePNG($im);
ImageDestroy($im);
?>
cp fonts.ttf /usr/share/fonts/
这一条命令足以??、
下面我说一下我的 TrueType 字体安装方法:
在 /etc/X11/fs/ 目录下有一个 config 文件,打开此文件,你就会看见 "catalogue =" 后面的目录就是 RH7.2 的所有已安装的字体目录.下次你修改这个文件的时候请注意:
1,每个目录行都是以 TAB 键为开头,以","(逗号)为结束;
2,最后一个目录行后无任何符号.
TrueType 字体安装方法一:
1,将 simsun.ttf (或 simsun.ttc, RH7.2 对 ttf 和 ttc 文件都支持)拷贝至 /usr/share/fonts/default/TrueType
2,进入 /etc/rc.d/init.d/ 目录,运行
./xfs restart
或重新启动 linux 就OK啦.
问题:
1,有的文章说要修改XF86Config-4文件,增加"/usr/share/fonts/default/TrueType" 路径和 Load "xtt", 我试过,改不改效果一样.
2,用这种方法可以安装 windows 下的大部份 ttf, ttc 字体如simkai.ttf, simyou.ttf 等,但对有些字体如: simfang.ttf, xfs 无法正确识别字体信息,修改 fonts.dir 和 fonts.scale 也没用,因为RH在启动的时候 xfs 会自动刷新这两个文件.用下面的方法就可以解决这个问题.
TrueType 字体安装方法二:
1,在 /etc/X11/fs/config 文件中字体路径部分插入一行
/usr/X11R6/lib/X11/fonts/TrueType, (请注意格式)
2,运行 /etc/rc.d/init.d/xfs restart 命令后就会发现字体中多了几个以 alias 打头的字体,其实这几个字体和 arphic 打头的字体是一样的.以 arphic 打头的字体是从 /usr/share/fonts/zh_CN/TrueType 和 /usr/share/fonts/zh_TW/TrueType 两个字体目录中来的.
3,自建一个目录,如 /WinTrueType 把你所需要安装的 TrueType 字体全部拷贝到这个目录下
4,进入 /usr/share/fonts/install 目录
# cd /usr/share/fonts/install
运行 ./xttfm.ttfm --add 命令
例如你要安装simsun.ttc字体,那么
# ./xttfm.ttfm --add /WinTrueType/simsun.ttc
# /etc/rc.d/init.d/xfs restart
就会产生 aliasmisc-simsun 和 misc-simsun 两个字体,是一样的.
例如你要安装 simfang.ttf 字体,那么
# ./xttfm.ttfm --add /WinTrueType/simfang.ttf
# /etc/rc.d/init.d/xfs restart
同样也会有 aliasmisc-fangsong_gb2312 和 misc-fangsong_gb2312 两个字体.
5,如果没有 xttfm.ttfm 文件,那么你可能没有安装 ttfm-0.9.1-8.i386.rpm, 在第二张安装盘上.
6,xttfm.ttfm 的使用方法请见 xttfm.ttfm --help
xttfm.ttfm 是一个 shell 脚本,你可以 vi xttfm.ttfm 看一看就明白啦.
注意: xttfm.ttfm 在 /usr/X11R6/lib/X11/fonts/TrueType 目录生成的是一个链接文件.
7,xttfm.ttfm 对 TrueType 字体信息识别很全建议使用这种方法.
为SuSE添加字体
本以为SuSE添加字体会用到ttmkfdir、mkfontdir、mkfontscale这些命令的,可是怎么也找到ttmkfdir,打算装一个,可是google了一下。发现SuSE添加字体远没那么麻烦。只要把要添加的字体copy到相应的truetype目录,运行SuSEconfig- modulefonts即可,要想让新装的字体在当前会话有效,运行xsetfprehash。
注:找了SuSE的官方文档,要把字体文件添加到这个目录下:
/usr/X11R6/lib/X11/fonts/truetype
否则添加的字体只能Root用,别的用户没法用。
相信在unix下编程的没有不知道makefile的,刚开始学习unix平台
下的东西,了解了下makefile的制作,觉得有点东西可以记录下。
下面是一个极其简单的例子:
现在我要编译一个Hello world,需要如下三个文件:
1. print.h
#include<stdio.h>
void printhello();
2. print.c
#include"print.h"
void printhello(){
printf("Hello, world\n");
}
3. main.c
#include "print.h"
int main(void){
printhello();
return 0;
}
好了,很简单的程序了。如果我们想要编译成功需要哪些步骤呢?
我认为在这里需要理解的就两步:
# 为每一个 *.c文件生成 *o文件。
# 连接每一个*o文件,生成可执行文件。
下面的makefile 就是根据这样的原则来写的。
一:makefile 雏形:
#makefile的撰写是基于规则的,当然这个规则也是很简单的,就是:
#target : prerequisites
command //任意的shell 命令
实例如下:
makefile:
helloworld : main.o print.o #helloword 就是我们要生成的目标
# main.o print.o是生成此目标的先决条件
gcc -o helloworld main.o print.o#shell命令,最前面的一定是一个tab键
mian.o : mian.c print.h
gcc -c main.c
print.o : print.c print.h
gcc -c print.c
clean :
rm helloworld main.o print.o
OK,一个简单的makefile制作完毕,现成我们输入 make,自动调用Gcc编译了,
输入 make clean就会删除 hellowworld mian.o print.o
二:小步改进:
在上面的例子中我们可以发现 main.o print.o 被定义了多处,
我们是不是可以向C语言中定义一个宏一样定义它呢?当然可以:
makefile:
objects = main.o print.o #应该叫变量的声明更合适
helloworld : $(objects) //声明了变量以后使用就要$()了
gcc -o helloworld$(objects)
mian.o : mian.c print.h
gcc -c main.c
print.o : print.c print.h
gcc -c print.c
clean :
rm helloworld $(objects)
修改完毕,这样使用了变量的话在很多文件的工程中就能体现出方便性了。
三:再进一步:
再看一下,为没一个*.o文件都写一句gcc -c main.c是不是显得多余了,
能不能把它干掉?而且 main.c 和print.c都需要print.h,为每一个都写上是
不是多余了,能不能再改进?
能,当然能了:
makefile:
objects = main.o print.o
helloworld : $(objects)
gcc -o helloworld$(objects)
$(objects) : print.h # 都依赖print.h
mian.o : mian.c #干掉了gcc -c main.c 让Gun make自动推导了。
print.o : print.c
clean :
rm helloworld $(objects)
好了,一个简单的makefile就这样完毕了,简单吧。
下的东西,了解了下makefile的制作,觉得有点东西可以记录下。
下面是一个极其简单的例子:
现在我要编译一个Hello world,需要如下三个文件:
1. print.h
#include<stdio.h>
void printhello();
2. print.c
#include"print.h"
void printhello(){
printf("Hello, world\n");
}
3. main.c
#include "print.h"
int main(void){
printhello();
return 0;
}
好了,很简单的程序了。如果我们想要编译成功需要哪些步骤呢?
我认为在这里需要理解的就两步:
# 为每一个 *.c文件生成 *o文件。
# 连接每一个*o文件,生成可执行文件。
下面的makefile 就是根据这样的原则来写的。
一:makefile 雏形:
#makefile的撰写是基于规则的,当然这个规则也是很简单的,就是:
#target : prerequisites
command //任意的shell 命令
实例如下:
makefile:
helloworld : main.o print.o #helloword 就是我们要生成的目标
# main.o print.o是生成此目标的先决条件
gcc -o helloworld main.o print.o#shell命令,最前面的一定是一个tab键
mian.o : mian.c print.h
gcc -c main.c
print.o : print.c print.h
gcc -c print.c
clean :
rm helloworld main.o print.o
OK,一个简单的makefile制作完毕,现成我们输入 make,自动调用Gcc编译了,
输入 make clean就会删除 hellowworld mian.o print.o
二:小步改进:
在上面的例子中我们可以发现 main.o print.o 被定义了多处,
我们是不是可以向C语言中定义一个宏一样定义它呢?当然可以:
makefile:
objects = main.o print.o #应该叫变量的声明更合适
helloworld : $(objects) //声明了变量以后使用就要$()了
gcc -o helloworld$(objects)
mian.o : mian.c print.h
gcc -c main.c
print.o : print.c print.h
gcc -c print.c
clean :
rm helloworld $(objects)
修改完毕,这样使用了变量的话在很多文件的工程中就能体现出方便性了。
三:再进一步:
再看一下,为没一个*.o文件都写一句gcc -c main.c是不是显得多余了,
能不能把它干掉?而且 main.c 和print.c都需要print.h,为每一个都写上是
不是多余了,能不能再改进?
能,当然能了:
makefile:
objects = main.o print.o
helloworld : $(objects)
gcc -o helloworld$(objects)
$(objects) : print.h # 都依赖print.h
mian.o : mian.c #干掉了gcc -c main.c 让Gun make自动推导了。
print.o : print.c
clean :
rm helloworld $(objects)
好了,一个简单的makefile就这样完毕了,简单吧。
你是不是把搜狗设置成默认输入法了,如果是这样的话,建议你重新设置一下默认输入法就可以了。 能换输入法 就是不能关掉 你看看你的输入法中,是不是没有了“简体中文---美式键盘”这一项了,如果没有的话,你怎么切换也都是拼音或者五笔输入法来的。
Ctrl+空格 是切换输入法和美式键盘的,如果你的电脑里没有美式键盘,或者美式键盘是在英文项下的就切换不了。
控制面板--》区域和语言-》键盘和语言-》更改键盘-》添加->中文美式键盘 即可!
Ctrl+空格 是切换输入法和美式键盘的,如果你的电脑里没有美式键盘,或者美式键盘是在英文项下的就切换不了。
控制面板--》区域和语言-》键盘和语言-》更改键盘-》添加->中文美式键盘 即可!
http://blog.s135.com/post/257/
http://hi.baidu.com/icej/blog/item/2f6dfe5004edca5d1138c2d6.html
http://hi.baidu.com/icej/blog/item/2f6dfe5004edca5d1138c2d6.html
在启动时关闭sendmail 服务 [其它服务也一样]
在启动时关闭sendmail- -对其他的服务可以采取同样的措施。
而对于那些不是从inetd启动的服务,则通过命令来关闭,例如需要关闭sendmail服务,则:
/etc/rc.d/init.d/sendmail stop
然后再设置其不在系统启动时启动:
chkconfig --levels 12345 sendmail off
启动sendmail服务:
/etc/rc.d/init.d/sendmail start
Suse Linux系统:
启动:/etc/init.d/sendmail start
关闭:/etc/init.d/sendmail stop
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
Linux启动sendmail速度慢的解决办法 新装的linux系统,重启后发现启动非常慢,一直停在sendmail这里,占用了大量的时间,经过查找资料,发现网络上的大多都不准确,后来找到一个解决办法:
环境: Linux AS4 Update6
# vi /etc/hosts
127.0.0.1 localhost.localdomain localhost
修改成
127.0.0.1 localhost.localdomain localhost 主机名称
查看本机的主机名称的命令是: hostname
只保留这一行就行,多余的行就可以删掉
reboot后发现启动正常
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
再用Redhat 4的时候,总是发现启动速度超级的慢,停留在sendmail启动的那个阶段,在网上搜索一下,找到了解决方案,留在这里备忘同时与大家分享一下
在大部分linux发行版本中,sendmail这个古老的邮件系统包是默认安装的,装完系统后,重启时,不少兄弟遇到在启动过程中,到了启动sendmail服务的时候就停止了,没有耐性和经验的朋友这时候可能会以为系统出故障或者系统没有装好,其实既不是系统出故障,一般也不是系统没有安装好,而是系统sendmail的时候在查询你设置的主机名的A记录或反向域名记录,由于全球9台DNS根系统都在美国,这个时候会去查询本机主机名对应的dns A记录,特别时你安装系统时设置的一些“奇怪”的主机名的时候,比如webserver等等之类的,这个时候sendmail会去做这个操作过程。
Apr 28 13:41:36 webserver sendmail[3494]: gethostby*.getanswer: asked for "webserver IN AAAA", got type "A"
Apr 28 13:42:36 webserversendmail[3499]: gethostby*.getanswer: asked for "webserver IN AAAA", got type "A"
Apr 28 13:43:37 webserver sendmail: sendmail startup succeeded
Apr 28 13:43:37 webserver sm-msp-queue[3509]: gethostby*.getanswer: asked for "webserver IN AAAA", got type "A"
运气好,我的意思是你的“RP”好,呵呵,查询比较快,你感觉不到异样,“RP”不好,少则一到两分钟,多则四到五分钟,而且要命的是不报任何错误信息,这个时间大大超过了我们能忍受的“8s”时间了,心里承受力差的兄弟就要受煎熬了。
知道了问题的症结,就可以对症下药了,比如我们可以修改系统配置文件/etc /hosts 和/etc/resolv.conf
让sendmial绕过查询远程主机,这里给出一种最简单的方法,给主机设置一个别名
修改/etc/hosts ,未修改之前
127.0.0.1 localhost.localdomain localhost
修改成
127.0.0.1 localhost.localdomain localhost webserver
再次重新启动sendmail看看
[root@webserver ~]# service sendmail restart
Shutting down sm-client: [ OK ]
Shutting down sendmail: [ OK ]
Starting sendmail: [ OK ]
Starting sm-client: [ OK ]
启动时间已经到秒级了。
在启动时关闭sendmail- -对其他的服务可以采取同样的措施。
而对于那些不是从inetd启动的服务,则通过命令来关闭,例如需要关闭sendmail服务,则:
/etc/rc.d/init.d/sendmail stop
然后再设置其不在系统启动时启动:
chkconfig --levels 12345 sendmail off
启动sendmail服务:
/etc/rc.d/init.d/sendmail start
Suse Linux系统:
启动:/etc/init.d/sendmail start
关闭:/etc/init.d/sendmail stop
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
Linux启动sendmail速度慢的解决办法 新装的linux系统,重启后发现启动非常慢,一直停在sendmail这里,占用了大量的时间,经过查找资料,发现网络上的大多都不准确,后来找到一个解决办法:
环境: Linux AS4 Update6
# vi /etc/hosts
127.0.0.1 localhost.localdomain localhost
修改成
127.0.0.1 localhost.localdomain localhost 主机名称
查看本机的主机名称的命令是: hostname
只保留这一行就行,多余的行就可以删掉
reboot后发现启动正常
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
再用Redhat 4的时候,总是发现启动速度超级的慢,停留在sendmail启动的那个阶段,在网上搜索一下,找到了解决方案,留在这里备忘同时与大家分享一下
在大部分linux发行版本中,sendmail这个古老的邮件系统包是默认安装的,装完系统后,重启时,不少兄弟遇到在启动过程中,到了启动sendmail服务的时候就停止了,没有耐性和经验的朋友这时候可能会以为系统出故障或者系统没有装好,其实既不是系统出故障,一般也不是系统没有安装好,而是系统sendmail的时候在查询你设置的主机名的A记录或反向域名记录,由于全球9台DNS根系统都在美国,这个时候会去查询本机主机名对应的dns A记录,特别时你安装系统时设置的一些“奇怪”的主机名的时候,比如webserver等等之类的,这个时候sendmail会去做这个操作过程。
Apr 28 13:41:36 webserver sendmail[3494]: gethostby*.getanswer: asked for "webserver IN AAAA", got type "A"
Apr 28 13:42:36 webserversendmail[3499]: gethostby*.getanswer: asked for "webserver IN AAAA", got type "A"
Apr 28 13:43:37 webserver sendmail: sendmail startup succeeded
Apr 28 13:43:37 webserver sm-msp-queue[3509]: gethostby*.getanswer: asked for "webserver IN AAAA", got type "A"
运气好,我的意思是你的“RP”好,呵呵,查询比较快,你感觉不到异样,“RP”不好,少则一到两分钟,多则四到五分钟,而且要命的是不报任何错误信息,这个时间大大超过了我们能忍受的“8s”时间了,心里承受力差的兄弟就要受煎熬了。
知道了问题的症结,就可以对症下药了,比如我们可以修改系统配置文件/etc /hosts 和/etc/resolv.conf
让sendmial绕过查询远程主机,这里给出一种最简单的方法,给主机设置一个别名
修改/etc/hosts ,未修改之前
127.0.0.1 localhost.localdomain localhost
修改成
127.0.0.1 localhost.localdomain localhost webserver
再次重新启动sendmail看看
[root@webserver ~]# service sendmail restart
Shutting down sm-client: [ OK ]
Shutting down sendmail: [ OK ]
Starting sendmail: [ OK ]
Starting sm-client: [ OK ]
启动时间已经到秒级了。
在windows7下使用火狐中国版,安装后运行,2秒后会出现未响应状态,不能正常使用,现在提供解决办法:
删除安装目录下extensions文件夹下面的cpmanager@mozillaonline.com文件夹和内容即可,这个是火狐中国版组件管理器的插件,删除后火狐就运行正常了。
删除安装目录下extensions文件夹下面的cpmanager@mozillaonline.com文件夹和内容即可,这个是火狐中国版组件管理器的插件,删除后火狐就运行正常了。
查看进程状态: ps 命令的STAT字段, top命令的S字段:Z 12849 12851 [grep] <defunct>
ps -A -o 'stat,ppid,pid,cmd' | grep -e '^[Zz]' #以stat字断Z打头 ,只是-o 必须加参数 -A,否则也是出不来的。
#ps -A -o 'stat,ppid,pid,cmd' | grep -e '^[Zz]'
Zs 21717 14425 [sshd] <defunct>
一般这样用:
ps -eo 'stat,ppid,pid,cmd' |grep -e '^[Zz]'
#ps -eo 'stat,ppid,pid,cmd' |grep -e '^[Zz]'
Z 2985 3035 [sshd] <defunct>
Z 7032 7073 [sshd] <defunct>
Z 13322 13358 [sshd] <defunct>
Z 15954 15986 [sshd] <defunct>
自己的习惯性实践:
一)僵尸进程:
一个子进程在其父进程还没有调用wait()或waitpid()的情况下退出。这个子进程就是僵尸进程。
。
(子进程在父进程还没有来得及繁忙或Sleep等或子进程执行太快就退出,而父亲没来得及调用产生的)
产生和查看僵死进程:
ps -A -ostat,ppid,pid,cmd |grep -e '^[Zz]'|awk '{print $2}'|xargs kill -9
C语言版本,#cat defunct.c :
#./a.out &
[1] 15649
# ps -A -o stat,ppid,pid,cmd | grep -e '^[Zz]'
Z 15649 15652 [a.out] <defunct>
僵尸进程是指的父进程已经退出,而该进程dead之后没有进程接受,就成为僵尸进程.(zombie)进程
怎样产生僵尸进程的:
一个进程在调用exit命令结束自己的生命的时候,其实它并没有真正的被销毁,而是留下一个称为僵尸进程(Zombie)的数据结构(系统调用 exit,它的作用是使进程退出,但也仅仅限于将一个正常的进程变成一个僵尸进程,并不能将其完全销毁)。在Linux进程的状态中,僵尸进程是非常特殊的一种,它已经放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程的退出状态等信息供其他进程收集,除此之外,僵尸进程不再占有任何内存空间。它需要它的父进程来为它收尸,如果他的父进程没安装 SIGCHLD信号处理函数调用wait或waitpid()等待子进程结束,又没有显式忽略该信号,那么它就一直保持僵尸状态,如果这时父进程结束了,那么init进程自动会接手这个子进程,为它收尸,它还是能被清除的。但是如果如果父进程是一个循环,不会结束,那么子进程就会一直保持僵尸状态,这就是 为什么系统中有时会有很多的僵尸进程。
来自:https://www.easyswoole.com/Cn/NoobCourse/PHP/Multiprocess/zombieProcess.html
二)孤儿进程:
孤儿进程指的是在其父进程执行完成或被终止后仍继续运行的一类进程。这些孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。
孤儿进程没有任何危害,只是需要注意自己的代码逻辑即可. 例如:
孤儿进程和僵尸进程
僵尸进程:一个子进程在其父进程还没有调用wait()或waitpid()的情况下退出。这个子进程就是僵尸进程。任何一个子进程(init除外)在exit()之后,并非马上就消失掉,而是留下一个称为僵尸进程(Zombie)的数据结构,等待父进程处理。这是每个 子进程在结束时都要经过的阶段。如果子进程在exit()之后,父进程没有来得及处理,那么保留的那段信息就不会释放,其进程号就会一直被占用,但是系统所能使用的进程号是有限的,如果大量的产生僵尸进程,将因为没有可用的进程号而导致系统不能产生新的进程. 此即为僵尸进程的危害,应当避免。
孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。孤儿进程是没有父进程的进程,孤儿进程这个重任就落到了init进程身上,init进程就好像是一个民政局,专门负责处理孤儿进程的善后工作。每当出现一个孤儿进程的时候,内核就把孤 儿进程的父进程设置为init,而init进程会循环地wait()它的已经退出的子进程。这样,当一个孤儿进程凄凉地结束了其生命周期的时候,init进程就会代表党和政府出面处理它的一切善后工作。因此孤儿进程并不会有什么危害 。
来自:https://www.easyswoole.com/Cn/NoobCourse/PHP/Multiprocess/orphanProcess.html
三)守护进程 :
守护进程
守护进程(daemon)是一类在后台运行的特殊进程,用于执行特定的系统任务。很多守护进程在系统引导的时候启动,并且一直运行直到系统关闭。另一些只在需要的时候才启动,完成任务后就自动结束。
用户使守护进程独立于所有终端是因为,在守护进程从一个终端启动的情况下,这同一个终端可能被其他的用户使用。例如,用户从一个终端启动守护进程后退出,然后另外一个人也登录到这个终端。用户不希望后者在使用该终端的过程中,接收到守护进程的任何错误信息。同样,由终端键入的任何信号(例如中断信号)也不应该影响先前在该终端启动的任何守护进程的运行。虽然让服务器后台运行很容易(只要shell命令行以&结尾即可),但用户还应该做些工作,让程序本身能够自动进入后台,且不依赖于任何终端。
创建步骤
调用fork(),创建新进程,它会是将来的守护进程.
在父进程中调用exit,保证子进程不是父进程,成为孤儿进程
调用setsid()创建新的会话区,让进程摆脱原会话的控制、让进程摆脱原进程组的控制和让进程摆脱原控制终端的控制。(如果不进行这步,孤儿进程将会在控制终端退出后退出)
将当前目录改成根目录(如果把当前目录作为守护进程的目录,当前目录不能被卸载他作为守护进程的工作目录)
将标准输入,标注输出,标准错误重定向到/dev/null.(否则会在控制终端中输出)
重设文件创建掩码,文件创建掩码是指屏蔽掉文件创建时的对应位。由于使用fork函数新建的子进程继承了父进程的文件创建掩码,这就给该子进程使用文件带来了诸多的麻烦。因此,把文件创建掩码设置为0,可以大大增强该守护进程的灵活性。设置文件创建掩码的函数是umask,通常的使用方法为umask(0)。
关闭文件描述符,用fork新建的子进程会从父进程那里继承一些已经打开了的文件。这些被打开的文件可能永远不会被守护进程读或写,但它们一样消耗系统资源,可能导致所在的文件系统无法卸载。
特点
首先,守护进程最重要的特性是后台运行。其次,守护进程必须与其运行前的环境隔离开来。这些环境包括未关闭的文件描述符、控制终端、会话和进程组、工作目录以及文件创建掩码等。这些环境通常是守护进程从执行它的父进程(特别是shell)继承下来的。最后,守护进程的启动方式有其特殊之处。它可以在Linux系统启动时从启动脚本/etc/rc.d中启动,也可以由作业控制进程crond启动,还可以由用户终端(通常是shell)执行。
除这些以外,守护进程与普通进程基本上没有什么区别。因此,编写守护进样实际上是把一个普通进程按照上述的守护进程的特性改造成为守护进程。
分类
按照服务类型分为如下几个。
系统守护进程:syslogd、login、crond、at等。
网络守护进程:sendmail、httpd、xinetd、等。
独立启动的守护进程:httpd、named、xinetd等。
被动守护进程(由xinetd启动):telnet、finger、ktalk等。
来自:https://www.easyswoole.com/Cn/NoobCourse/PHP/Multiprocess/deamon.html
=====================================================================
普通进程,父进程不主动去回收子进程的资源。
一个子进程在其父进程还没有调用wait()或waitpid()的情况下退出。这个子进程就是僵尸进程。产生僵尸进程的原因:
1、子进程结束后向父进程发出SIGCHLD信号,父进程默认忽略了它;
2、父进程没有调用wait()或waitpid()函数来等待子进程的结束;
处理办法:把父进程杀掉,僵尸进程会变成孤儿进程,然后过继给1号进程,而1号进程会扫描名下子进程,把 Z 状态进程回收;
这时候僵尸进程已经退出了,只保留了task_struct结构体,所以发信号(-9等信号)去处理僵尸进程是无效的;
4.僵尸进程解决办法:
4.1 改写父进程,在子进程死后要为它收尸。具体做法是接管SIGCHLD信号。子进程死后,会发送SIGCHLD信号给父进程,父进程收到此信号后,执行 waitpid()函数为子进程收尸。这是基于这样的原理:就算父进程没有调用wait,内核也会向它发送SIGCHLD消息,尽管对的默认处理是忽略,如果想响应这个消息,可以设置一个处理函数。
4.2 把父进程杀掉。父进程死后,僵尸进程成为"孤儿进程",过继给1号进程init,init始终会负责清理僵尸进程.它产生的所有僵尸进程也跟着消失。
kill -9 `ps -ef | grep "Process Name" | awk '{ print $3 }'`
其中,“Process Name”为处于zombie状态的进程名。
4.3 杀父进程不行的话,就尝试用skill -t TTY关闭相应终端,TTY是进程相应的tty号(终端号)。但是,ps可能会查不到特定进程的tty号,这时就需要自己判断了。
4.4 实在不行,重启系统吧,这也是最常用到方法之一。
来自:https://blog.csdn.net/YuZhiHui_No1/article/details/53011390
查找并杀死僵尸进程:ps aux|grep Z
杀死:用SIGKILL信号杀死进程,但是僵尸进程已经死了,需要输入的命令应该是:kill -s SIGCHLD pid ,这里的pid替换成父进程的id,这样父进程就会删除所有以及完成并死掉的子进程了。
首先,我们可以用top命令来查看服务器当前是否有僵尸进程,可以看到第二行行尾有个 0 zombie,如果数字大于0,那么意味着服务器当前存在有僵尸进程
可以用ps和grep命令寻找僵尸进程
ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]'
命令选项说明:
-A 参数列出所有进程
-o 自定义输出字段 我们设定显示字段为 stat(状态), ppid(进程父id), pid(进程id),cmd(命令)这四个参数
因为状态为 z或者Z的进程为僵尸进程,所以我们使用grep抓取stat状态为zZ进程
运行结果参考如下
Z 12334 12339 /path/cmd
这时,我们可以使用 kill -HUP 12339来杀掉这个僵尸进程
运行后,可以再次运行ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]'来确认是否将僵尸进程杀死
如果kill 子进程的无效,可以尝试kill 其父进程来解决问题,例如上面例子父进程pid是 12334,那么我们就运行
kill -HUP 12334来解决问题
但是很多僵尸进程都很难kill掉.得找到原头再去处理.
摘自:http://blog.sina.com.cn/s/blog_9426b1bd0101cu0l.html
——————————————————————————————————————————————————————
1) 检查当前僵尸进程信息
# ps -ef | grep defunct | grep -v grep | wc -l
175
# top | head -2
top - 15:05:54 up 97 days, 23:49, 4 users, load average: 0.66, 0.45, 0.39
Tasks: 829 total, 1 running, 479 sleeping, 174 stopped, 175 zombie
# ps -ef | grep defunct | grep -v grep
2) 获得杀僵尸进程语句
# ps -ef | grep defunct | grep -v grep | awk '{print "kill -9 " $2,$3}'
执行上面获得的语句即可, 使用信号量9, 僵尸进程数会大大减少.
3) 过一会儿检查当前僵尸进程信息
# ps -ef | grep defunct | grep -v grep | wc -l
125
# top | head -2
top - 15:29:26 up 98 days, 12 min, 7 users, load average: 0.27, 0.54, 0.56
Tasks: 632 total, 1 running, 381 sleeping, 125 stopped, 125 zombie
发现僵尸进程数减少了一些, 但还有不少啊.
4) 再次获得杀僵尸进程语句
# ps -ef | grep defunct | grep -v grep | awk '{print "kill -18 " $3}'
执行上面获得的语句即可, 这次使用信号量18杀其父进程, 僵尸进程应该会全部消失.
5) 过一会儿再检查当前僵尸进程信息
# ps -ef | grep defunct | grep -v grep | wc -l
0
# top | head -2
top - 15:39:46 up 98 days, 23 min, 7 users, load average: 5.46, 2.20, 1.12
Tasks: 134 total, 1 running, 133 sleeping, 0 stopped, 0 zombie
6) 清除ZOMBIE(僵尸)进程原理
# kill -18 PPID
PPID是其父进程, 这个信号是告诉父进程, 该子进程已经死亡了, 请收回分配给他的资源. 如果还不行则看先看其父进程又无其他子进程, 如果有, 可能需要先kill其他子进程, 也就是兄弟进程.
方法是:
# kill -15 PID1 PID2
PID1,PID2是僵尸进程的父进程的其它子进程.
然后再kill父进程:
# kill -15 PPID
--End--
来源:http://blog.chinaunix.net/u3/114157/showart_2229852.html
ps -A -o 'stat,ppid,pid,cmd' | grep -e '^[Zz]' #以stat字断Z打头 ,只是-o 必须加参数 -A,否则也是出不来的。
#ps -A -o 'stat,ppid,pid,cmd' | grep -e '^[Zz]'
Zs 21717 14425 [sshd] <defunct>
一般这样用:
ps -eo 'stat,ppid,pid,cmd' |grep -e '^[Zz]'
#ps -eo 'stat,ppid,pid,cmd' |grep -e '^[Zz]'
Z 2985 3035 [sshd] <defunct>
Z 7032 7073 [sshd] <defunct>
Z 13322 13358 [sshd] <defunct>
Z 15954 15986 [sshd] <defunct>
自己的习惯性实践:
一)僵尸进程:
一个子进程在其父进程还没有调用wait()或waitpid()的情况下退出。这个子进程就是僵尸进程。
。
(子进程在父进程还没有来得及繁忙或Sleep等或子进程执行太快就退出,而父亲没来得及调用产生的)
产生和查看僵死进程:
ps -A -ostat,ppid,pid,cmd |grep -e '^[Zz]'|awk '{print $2}'|xargs kill -9
C语言版本,#cat defunct.c :
#./a.out &
[1] 15649
# ps -A -o stat,ppid,pid,cmd | grep -e '^[Zz]'
Z 15649 15652 [a.out] <defunct>
僵尸进程是指的父进程已经退出,而该进程dead之后没有进程接受,就成为僵尸进程.(zombie)进程
怎样产生僵尸进程的:
一个进程在调用exit命令结束自己的生命的时候,其实它并没有真正的被销毁,而是留下一个称为僵尸进程(Zombie)的数据结构(系统调用 exit,它的作用是使进程退出,但也仅仅限于将一个正常的进程变成一个僵尸进程,并不能将其完全销毁)。在Linux进程的状态中,僵尸进程是非常特殊的一种,它已经放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程的退出状态等信息供其他进程收集,除此之外,僵尸进程不再占有任何内存空间。它需要它的父进程来为它收尸,如果他的父进程没安装 SIGCHLD信号处理函数调用wait或waitpid()等待子进程结束,又没有显式忽略该信号,那么它就一直保持僵尸状态,如果这时父进程结束了,那么init进程自动会接手这个子进程,为它收尸,它还是能被清除的。但是如果如果父进程是一个循环,不会结束,那么子进程就会一直保持僵尸状态,这就是 为什么系统中有时会有很多的僵尸进程。
来自:https://www.easyswoole.com/Cn/NoobCourse/PHP/Multiprocess/zombieProcess.html
二)孤儿进程:
孤儿进程指的是在其父进程执行完成或被终止后仍继续运行的一类进程。这些孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。
孤儿进程没有任何危害,只是需要注意自己的代码逻辑即可. 例如:
孤儿进程和僵尸进程
僵尸进程:一个子进程在其父进程还没有调用wait()或waitpid()的情况下退出。这个子进程就是僵尸进程。任何一个子进程(init除外)在exit()之后,并非马上就消失掉,而是留下一个称为僵尸进程(Zombie)的数据结构,等待父进程处理。这是每个 子进程在结束时都要经过的阶段。如果子进程在exit()之后,父进程没有来得及处理,那么保留的那段信息就不会释放,其进程号就会一直被占用,但是系统所能使用的进程号是有限的,如果大量的产生僵尸进程,将因为没有可用的进程号而导致系统不能产生新的进程. 此即为僵尸进程的危害,应当避免。
孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。孤儿进程是没有父进程的进程,孤儿进程这个重任就落到了init进程身上,init进程就好像是一个民政局,专门负责处理孤儿进程的善后工作。每当出现一个孤儿进程的时候,内核就把孤 儿进程的父进程设置为init,而init进程会循环地wait()它的已经退出的子进程。这样,当一个孤儿进程凄凉地结束了其生命周期的时候,init进程就会代表党和政府出面处理它的一切善后工作。因此孤儿进程并不会有什么危害 。
来自:https://www.easyswoole.com/Cn/NoobCourse/PHP/Multiprocess/orphanProcess.html
三)守护进程 :
守护进程
守护进程(daemon)是一类在后台运行的特殊进程,用于执行特定的系统任务。很多守护进程在系统引导的时候启动,并且一直运行直到系统关闭。另一些只在需要的时候才启动,完成任务后就自动结束。
用户使守护进程独立于所有终端是因为,在守护进程从一个终端启动的情况下,这同一个终端可能被其他的用户使用。例如,用户从一个终端启动守护进程后退出,然后另外一个人也登录到这个终端。用户不希望后者在使用该终端的过程中,接收到守护进程的任何错误信息。同样,由终端键入的任何信号(例如中断信号)也不应该影响先前在该终端启动的任何守护进程的运行。虽然让服务器后台运行很容易(只要shell命令行以&结尾即可),但用户还应该做些工作,让程序本身能够自动进入后台,且不依赖于任何终端。
创建步骤
调用fork(),创建新进程,它会是将来的守护进程.
在父进程中调用exit,保证子进程不是父进程,成为孤儿进程
调用setsid()创建新的会话区,让进程摆脱原会话的控制、让进程摆脱原进程组的控制和让进程摆脱原控制终端的控制。(如果不进行这步,孤儿进程将会在控制终端退出后退出)
将当前目录改成根目录(如果把当前目录作为守护进程的目录,当前目录不能被卸载他作为守护进程的工作目录)
将标准输入,标注输出,标准错误重定向到/dev/null.(否则会在控制终端中输出)
重设文件创建掩码,文件创建掩码是指屏蔽掉文件创建时的对应位。由于使用fork函数新建的子进程继承了父进程的文件创建掩码,这就给该子进程使用文件带来了诸多的麻烦。因此,把文件创建掩码设置为0,可以大大增强该守护进程的灵活性。设置文件创建掩码的函数是umask,通常的使用方法为umask(0)。
关闭文件描述符,用fork新建的子进程会从父进程那里继承一些已经打开了的文件。这些被打开的文件可能永远不会被守护进程读或写,但它们一样消耗系统资源,可能导致所在的文件系统无法卸载。
特点
首先,守护进程最重要的特性是后台运行。其次,守护进程必须与其运行前的环境隔离开来。这些环境包括未关闭的文件描述符、控制终端、会话和进程组、工作目录以及文件创建掩码等。这些环境通常是守护进程从执行它的父进程(特别是shell)继承下来的。最后,守护进程的启动方式有其特殊之处。它可以在Linux系统启动时从启动脚本/etc/rc.d中启动,也可以由作业控制进程crond启动,还可以由用户终端(通常是shell)执行。
除这些以外,守护进程与普通进程基本上没有什么区别。因此,编写守护进样实际上是把一个普通进程按照上述的守护进程的特性改造成为守护进程。
分类
按照服务类型分为如下几个。
系统守护进程:syslogd、login、crond、at等。
网络守护进程:sendmail、httpd、xinetd、等。
独立启动的守护进程:httpd、named、xinetd等。
被动守护进程(由xinetd启动):telnet、finger、ktalk等。
来自:https://www.easyswoole.com/Cn/NoobCourse/PHP/Multiprocess/deamon.html
=====================================================================
普通进程,父进程不主动去回收子进程的资源。
一个子进程在其父进程还没有调用wait()或waitpid()的情况下退出。这个子进程就是僵尸进程。产生僵尸进程的原因:
1、子进程结束后向父进程发出SIGCHLD信号,父进程默认忽略了它;
2、父进程没有调用wait()或waitpid()函数来等待子进程的结束;
处理办法:把父进程杀掉,僵尸进程会变成孤儿进程,然后过继给1号进程,而1号进程会扫描名下子进程,把 Z 状态进程回收;
这时候僵尸进程已经退出了,只保留了task_struct结构体,所以发信号(-9等信号)去处理僵尸进程是无效的;
4.僵尸进程解决办法:
4.1 改写父进程,在子进程死后要为它收尸。具体做法是接管SIGCHLD信号。子进程死后,会发送SIGCHLD信号给父进程,父进程收到此信号后,执行 waitpid()函数为子进程收尸。这是基于这样的原理:就算父进程没有调用wait,内核也会向它发送SIGCHLD消息,尽管对的默认处理是忽略,如果想响应这个消息,可以设置一个处理函数。
4.2 把父进程杀掉。父进程死后,僵尸进程成为"孤儿进程",过继给1号进程init,init始终会负责清理僵尸进程.它产生的所有僵尸进程也跟着消失。
kill -9 `ps -ef | grep "Process Name" | awk '{ print $3 }'`
其中,“Process Name”为处于zombie状态的进程名。
4.3 杀父进程不行的话,就尝试用skill -t TTY关闭相应终端,TTY是进程相应的tty号(终端号)。但是,ps可能会查不到特定进程的tty号,这时就需要自己判断了。
4.4 实在不行,重启系统吧,这也是最常用到方法之一。
来自:https://blog.csdn.net/YuZhiHui_No1/article/details/53011390
查找并杀死僵尸进程:ps aux|grep Z
杀死:用SIGKILL信号杀死进程,但是僵尸进程已经死了,需要输入的命令应该是:kill -s SIGCHLD pid ,这里的pid替换成父进程的id,这样父进程就会删除所有以及完成并死掉的子进程了。
首先,我们可以用top命令来查看服务器当前是否有僵尸进程,可以看到第二行行尾有个 0 zombie,如果数字大于0,那么意味着服务器当前存在有僵尸进程
可以用ps和grep命令寻找僵尸进程
ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]'
命令选项说明:
-A 参数列出所有进程
-o 自定义输出字段 我们设定显示字段为 stat(状态), ppid(进程父id), pid(进程id),cmd(命令)这四个参数
因为状态为 z或者Z的进程为僵尸进程,所以我们使用grep抓取stat状态为zZ进程
运行结果参考如下
Z 12334 12339 /path/cmd
这时,我们可以使用 kill -HUP 12339来杀掉这个僵尸进程
运行后,可以再次运行ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]'来确认是否将僵尸进程杀死
如果kill 子进程的无效,可以尝试kill 其父进程来解决问题,例如上面例子父进程pid是 12334,那么我们就运行
kill -HUP 12334来解决问题
但是很多僵尸进程都很难kill掉.得找到原头再去处理.
摘自:http://blog.sina.com.cn/s/blog_9426b1bd0101cu0l.html
——————————————————————————————————————————————————————
1) 检查当前僵尸进程信息
# ps -ef | grep defunct | grep -v grep | wc -l
175
# top | head -2
top - 15:05:54 up 97 days, 23:49, 4 users, load average: 0.66, 0.45, 0.39
Tasks: 829 total, 1 running, 479 sleeping, 174 stopped, 175 zombie
# ps -ef | grep defunct | grep -v grep
2) 获得杀僵尸进程语句
# ps -ef | grep defunct | grep -v grep | awk '{print "kill -9 " $2,$3}'
执行上面获得的语句即可, 使用信号量9, 僵尸进程数会大大减少.
3) 过一会儿检查当前僵尸进程信息
# ps -ef | grep defunct | grep -v grep | wc -l
125
# top | head -2
top - 15:29:26 up 98 days, 12 min, 7 users, load average: 0.27, 0.54, 0.56
Tasks: 632 total, 1 running, 381 sleeping, 125 stopped, 125 zombie
发现僵尸进程数减少了一些, 但还有不少啊.
4) 再次获得杀僵尸进程语句
# ps -ef | grep defunct | grep -v grep | awk '{print "kill -18 " $3}'
执行上面获得的语句即可, 这次使用信号量18杀其父进程, 僵尸进程应该会全部消失.
5) 过一会儿再检查当前僵尸进程信息
# ps -ef | grep defunct | grep -v grep | wc -l
0
# top | head -2
top - 15:39:46 up 98 days, 23 min, 7 users, load average: 5.46, 2.20, 1.12
Tasks: 134 total, 1 running, 133 sleeping, 0 stopped, 0 zombie
6) 清除ZOMBIE(僵尸)进程原理
# kill -18 PPID
PPID是其父进程, 这个信号是告诉父进程, 该子进程已经死亡了, 请收回分配给他的资源. 如果还不行则看先看其父进程又无其他子进程, 如果有, 可能需要先kill其他子进程, 也就是兄弟进程.
方法是:
# kill -15 PID1 PID2
PID1,PID2是僵尸进程的父进程的其它子进程.
然后再kill父进程:
# kill -15 PPID
--End--
来源:http://blog.chinaunix.net/u3/114157/showart_2229852.html
在我们使用CentOS系统的时候,也许时区经常会出现问题,有时候改完之后还是会出错,下面我们就来学习一种方法来改变这个状况。如果没有安装,而你使用的是 CentOS系统 那使用命令 yum install ntp
然后:ntpdate us.pool.ntp.org 。
因为CentOS系统是用rhas的源码再编译的,很多地方是完全一样的。
rhas5的时区是以文件形式存在的,当前的时区文件是在/etc/localtime
那么其他时区的文件存放在哪里呢?
在/usr/share/zoneinfo下
我们用东八区,北京,上海的时间
#cp -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
#reboot
重启之后,date查看时间、查看当前时区 date -R、查看/修改Linux时区和时间
一、时区
1. 查看当前时区
date -R
2. 修改设置时区
方法(1)
tzselect
方法(2) 仅限于RedHat Linux 和 CentOS系统
timeconfig
方法(3) 适用于Debian
dpkg-reconfigure tzdata
3. 复制相应的时区文件,替换CentOS系统时区文件;或者创建链接文件
cp /usr/share/zoneinfo/$主时区/$次时区 /etc/localtime
在中国可以使用:
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
二、时间
1、查看时间和日期
date
2、设置时间和日期
将CentOS系统日期设定成1996年6月10日的命令
date -s 06/22/96
将CentOS系统时间设定成下午1点52分0秒的命令
date -s 13:52:00
3. 将当前时间和日期写入BIOS,避免重启后失效
hwclock -w
三、定时同步时间
# /usr/sbin/ntpdate 210.72.145.44 > /dev/null 2>&1
这样我们就完成了关于设置修改CentOS系统时区的问题了。希望大家可以学习到更多的知识。
来源:http://blog.chinaunix.net/u3/114157/showart_2239588.html
我的配置:
Crontab:
*/30 * * * * /home/jackxiang/timeAdjust4Linux/timeAdjust4Linux.sh
Shell如下:
root@116.255.139.240:~/.vim/plugin# cat /home/jackxiang/timeAdjust4Linux/timeAdjust4Linux.sh
/usr/sbin/ntpdate 210.72.145.44 > /dev/null 2>&1
hwclock -w
然后:ntpdate us.pool.ntp.org 。
因为CentOS系统是用rhas的源码再编译的,很多地方是完全一样的。
rhas5的时区是以文件形式存在的,当前的时区文件是在/etc/localtime
那么其他时区的文件存放在哪里呢?
在/usr/share/zoneinfo下
我们用东八区,北京,上海的时间
#cp -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
#reboot
重启之后,date查看时间、查看当前时区 date -R、查看/修改Linux时区和时间
一、时区
1. 查看当前时区
date -R
2. 修改设置时区
方法(1)
tzselect
方法(2) 仅限于RedHat Linux 和 CentOS系统
timeconfig
方法(3) 适用于Debian
dpkg-reconfigure tzdata
3. 复制相应的时区文件,替换CentOS系统时区文件;或者创建链接文件
cp /usr/share/zoneinfo/$主时区/$次时区 /etc/localtime
在中国可以使用:
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
二、时间
1、查看时间和日期
date
2、设置时间和日期
将CentOS系统日期设定成1996年6月10日的命令
date -s 06/22/96
将CentOS系统时间设定成下午1点52分0秒的命令
date -s 13:52:00
3. 将当前时间和日期写入BIOS,避免重启后失效
hwclock -w
三、定时同步时间
# /usr/sbin/ntpdate 210.72.145.44 > /dev/null 2>&1
这样我们就完成了关于设置修改CentOS系统时区的问题了。希望大家可以学习到更多的知识。
来源:http://blog.chinaunix.net/u3/114157/showart_2239588.html
我的配置:
Crontab:
*/30 * * * * /home/jackxiang/timeAdjust4Linux/timeAdjust4Linux.sh
Shell如下:
root@116.255.139.240:~/.vim/plugin# cat /home/jackxiang/timeAdjust4Linux/timeAdjust4Linux.sh
/usr/sbin/ntpdate 210.72.145.44 > /dev/null 2>&1
hwclock -w
echo '<!data1eofdata2eofdata3eofdata4!>' | perl -p -e 's#eof#\r\n#g'
<!data1
data2
data3
data4!>
echo '<!data1eofdata2eofdata3eofdata4!>' | perl -p -e 's#eof#\r\n#g' | nc ip port
nc: port range not valid
背景:发现nc是能加-z 参数的,而netcat则不行,它们在Linux下的两个包都不相同,如下;
nc主要是用来在web这块做memcache的连接,再就是模拟一个tcp端口连接,然后做一些硬件上的调试,能看到发的数据之用:
http://jackxiang.com/post/3095/
用nc-1.84-24.el6进行批量IP的端口扫描脚本:
/tmp/scripts/ip-ports.txt
cat /tmp/ncports.sh
运行:
sh ncports.sh
192.168.0.100 80:fail
192.168.0.100 8081:fail
192.168.0.101 8082:fail
192.168.1.100 21:fail
二、将IP全写到一个shell脚本的数组里:
/tmp/foreachnc.sh
#sh foreachnc.sh
Connection to 10.73.234.143 22 port [tcp/ssh] succeeded! #绿色显示
nc 10.73.234.143 success.
Connection to 123.57.252.183 22 port [tcp/ssh] succeeded!
nc 123.57.252.183 success.
==========================================================================
netcat 在centos里叫:
nc.x86_64
可以用:
yum search nc
找下。
——————
[root@jackxiang ~]# yum install nc.x86_64
Total download size: 57 k
Installed size: 109 k
Is this ok [y/N]: y
http://sourceforge.net/projects/netcat/files/netcat/0.7.1/netcat-0.7.1-1.i386.rpm/download
[/home/jackxiang/netcat]# rpm -ihv netcat-0.7.1-1.i386.rpm
warning: netcat-0.7.1-1.i386.rpm: Header V3 DSA signature: NOKEY, key ID b2d79fc1
Preparing... ########################################### [100%]
package netcat-1.10-883.2 (which is newer than netcat-0.7.1-1) is already installed
file /usr/bin/netcat from install of netcat-0.7.1-1 conflicts with file from package netcat-1.10-883.2
file /usr/share/man/man1/netcat.1.gz from install of netcat-0.7.1-1 conflicts with file from package netcat-1.10-883.2
netcat的命令行程序名字为nc,是netcat的缩写,安装完了是找不到netcat这个程序的.
可以执行nc了,哈哈
nc (NetCat) 网络安全工具介绍 搞系统安全的人,可能没人没听说过大名鼎鼎的nc吧,它可以代替telnet,可以启监听程序,可以用来传输文件,可以用来作为黑客辅助程序,深受大量hacker的喜爱,其功能有如瑞士军刀般好用。
NetCat是一个非常简单的Unix工具,可以读、写TCP或UDP网络连接(network connection)。它被设计成一个可靠的后端(back-end)工具,能被其它的程序程序或脚本直接地或容易地驱动。同时,它又是一个功能丰富的网络调试和开发工具,因为它可以建立你可能用到的几乎任何类型的连接,以及一些非常有意思的内建功能。NetCat,它的实际可运行的名字叫nc,应该早很就被提供,就象另一个没有公开但是标准的Unix工具。有gnu版本和 windows下的运行版本, 这里仅介绍unix版的。
NetCat可以发现网络上的设备并且绘制网络地图。人们可以从Sourceforge网站和@stake网站下载这一工具。NetCat是由一位前@stake员工所编写。
目前,@stake大约提供二十多种安全工具,工具种类涉及信息采集、证据收集、网络实用工具、口令审计、恢复与修补以及安全漏洞扫描等。其中,Andreas Junestam编写的WFPdisable、Paul Clip编写的AUSTIN、Frederic Bret-Mount开发的ComBust以及Ollie Whitehouse开发的WAP Assessment Tool都以保持最新状态而闻名
首先我们要弄明白netcat的工作原理,其实netcat的原理很简单,它就是从网络的一端读入数据,然后输出到网络的另一端,它可以使用tcp 和udp协议.之所以叫做netcat,因为它是网络上的cat,想象一下cat的功能,读出一个文件的内容,然后输出到屏幕上(默认的stdout是屏幕,当然可以重定向到其他地方).netcat也是如此,它读取一端的输入,然后传送到网络的另一端,
就这么简单.但是千万不要小看了它,netcat可以完成很多任务,,尤其是和其他程序组合时.好了,废话少说,进入正题吧.:p
网上有两种版本的netcat,一个是@stake公司的netcat,在
http://www.l0pht.com/~weld/netcat/
可以下载。
gnu的可以在 http://netcat.sourceforge.net/download.php 下载。
FreeBSD下的安装:
cvsup更新ports后,
# cd /usr/ports/net/netcat && make -s install distclean
安装好后,输入
nc或man nc,就可以看到相关信息了。
使用:
最简单的使用方法,”nc host port”,能建立一个TCP连接,连向指定的主机和端口。接下来,你的从标准输入中输入的任何内容都会被发送到指定的主机,任何通过连接返回来的信息都被显示在你的标准输出上。这个连接会一直持续下去,至到连接两端的程序关闭连接。注意,这种行为不同于大多数网络程序,它们会在从标准输入读到一个文件结束符后退出。
NetCat还可以当服务器使用,监听任意指定端口的连接请求(inbound connection),并可做同样的读写操作。除了较小限制外,它实际并不关心自己以“客户端”模式还是“服务器”模式运行,它都会来回运送全部数据。在任何一种模式下,都可以设置一个非活动时间来强行关闭连接。
它还可以通过UDP来完成这些功能,因此它就象一个telnet那样的UDP程序,用来测试你的UDP服务器。正如它的“U”所指的,UDP跟TCP相比是一种不可靠的数据传输,一些系统在使用UDP传送大量数据时会遇到麻烦,但它还有一些用途。
你可能会问“为什么不用telnet来连接任意的端口”?问题提得好(valid),这儿有一些理由。Telnet有“标准输入文件结束符 (standard input EOF)”问题,所以需要在脚本中延迟计算以便等待网络输出结束。这就是netcat持续运行直到连接被关闭的主要原因。Telnet也不能传输任意的二进制数据,因为一些特定的字符会被解释为Telnet的参数而被从数据流中去除。Telnet还将它的一些诊断信息显示到标准输出上,而NetCat会将这信息与它的输出分开以不改变真实数据的传输,除非你要求它这么做。当然了,Telnet也不能监听端口,也不能使用UDP。NetCat没有这些限制,比Telnet更小巧和快捷,而且还有一些其它的功能。
<!data1
data2
data3
data4!>
echo '<!data1eofdata2eofdata3eofdata4!>' | perl -p -e 's#eof#\r\n#g' | nc ip port
nc: port range not valid
背景:发现nc是能加-z 参数的,而netcat则不行,它们在Linux下的两个包都不相同,如下;
nc主要是用来在web这块做memcache的连接,再就是模拟一个tcp端口连接,然后做一些硬件上的调试,能看到发的数据之用:
http://jackxiang.com/post/3095/
用nc-1.84-24.el6进行批量IP的端口扫描脚本:
/tmp/scripts/ip-ports.txt
cat /tmp/ncports.sh
运行:
sh ncports.sh
192.168.0.100 80:fail
192.168.0.100 8081:fail
192.168.0.101 8082:fail
192.168.1.100 21:fail
二、将IP全写到一个shell脚本的数组里:
/tmp/foreachnc.sh
#sh foreachnc.sh
Connection to 10.73.234.143 22 port [tcp/ssh] succeeded! #绿色显示
nc 10.73.234.143 success.
Connection to 123.57.252.183 22 port [tcp/ssh] succeeded!
nc 123.57.252.183 success.
==========================================================================
netcat 在centos里叫:
nc.x86_64
可以用:
yum search nc
找下。
——————
[root@jackxiang ~]# yum install nc.x86_64
Total download size: 57 k
Installed size: 109 k
Is this ok [y/N]: y
http://sourceforge.net/projects/netcat/files/netcat/0.7.1/netcat-0.7.1-1.i386.rpm/download
[/home/jackxiang/netcat]# rpm -ihv netcat-0.7.1-1.i386.rpm
warning: netcat-0.7.1-1.i386.rpm: Header V3 DSA signature: NOKEY, key ID b2d79fc1
Preparing... ########################################### [100%]
package netcat-1.10-883.2 (which is newer than netcat-0.7.1-1) is already installed
file /usr/bin/netcat from install of netcat-0.7.1-1 conflicts with file from package netcat-1.10-883.2
file /usr/share/man/man1/netcat.1.gz from install of netcat-0.7.1-1 conflicts with file from package netcat-1.10-883.2
netcat的命令行程序名字为nc,是netcat的缩写,安装完了是找不到netcat这个程序的.
[root@linux ~]# nc [IP|host] [port]
[root@linux ~]# nc -l -p [port]
参数:
-l,作为监听之用,亦即开启一个 port 来监听用户的联机。
-p,开启的这个 Port Number。
[root@linux ~]# nc -l -p [port]
参数:
-l,作为监听之用,亦即开启一个 port 来监听用户的联机。
-p,开启的这个 Port Number。
root@mail etc #nc -h
GNU netcat 0.7.0, a rewrite of the famous networking tool.
Basic usages:
connect to somewhere: nc [options] hostname port [port] ...
listen for inbound: nc -l -p port [options] [hostname] [port] ...
tunnel to somewhere: nc -L hostnameort -p port [options]
Mandatory arguments to long options are mandatory for short options too.
Options:
-c, --close close connection on EOF from stdin
-e, --exec=PROGRAM program to exec after connect
-g, --gateway=LIST source-routing hop point[s], up to 8
-G, --pointer=NUM source-routing pointer: 4, 8, 12, ...
-h, --help display this help and exit
-i, --interval=SECS delay interval for lines sent, ports scanned
-l, --listen listen mode, for inbound connects
-L, --tunnel=ADDRESS:PORT forward local port to remote address
-n, --dont-resolve numeric-only IP addresses, no DNS
-o, --output=FILE output hexdump traffic to FILE (implies -x)
-p, --local-port=NUM local port number
-r, --randomize randomize local and remote ports
GNU netcat 0.7.0, a rewrite of the famous networking tool.
Basic usages:
connect to somewhere: nc [options] hostname port [port] ...
listen for inbound: nc -l -p port [options] [hostname] [port] ...
tunnel to somewhere: nc -L hostnameort -p port [options]
Mandatory arguments to long options are mandatory for short options too.
Options:
-c, --close close connection on EOF from stdin
-e, --exec=PROGRAM program to exec after connect
-g, --gateway=LIST source-routing hop point[s], up to 8
-G, --pointer=NUM source-routing pointer: 4, 8, 12, ...
-h, --help display this help and exit
-i, --interval=SECS delay interval for lines sent, ports scanned
-l, --listen listen mode, for inbound connects
-L, --tunnel=ADDRESS:PORT forward local port to remote address
-n, --dont-resolve numeric-only IP addresses, no DNS
-o, --output=FILE output hexdump traffic to FILE (implies -x)
-p, --local-port=NUM local port number
-r, --randomize randomize local and remote ports
/usr/bin/ 已经在path下面
vi vi .bash_profile
加入:
alias nc='netcat'
vi vi .bash_profile
加入:
alias nc='netcat'
source /root/.bash_profile
可以执行nc了,哈哈
nc (NetCat) 网络安全工具介绍 搞系统安全的人,可能没人没听说过大名鼎鼎的nc吧,它可以代替telnet,可以启监听程序,可以用来传输文件,可以用来作为黑客辅助程序,深受大量hacker的喜爱,其功能有如瑞士军刀般好用。
NetCat是一个非常简单的Unix工具,可以读、写TCP或UDP网络连接(network connection)。它被设计成一个可靠的后端(back-end)工具,能被其它的程序程序或脚本直接地或容易地驱动。同时,它又是一个功能丰富的网络调试和开发工具,因为它可以建立你可能用到的几乎任何类型的连接,以及一些非常有意思的内建功能。NetCat,它的实际可运行的名字叫nc,应该早很就被提供,就象另一个没有公开但是标准的Unix工具。有gnu版本和 windows下的运行版本, 这里仅介绍unix版的。
NetCat可以发现网络上的设备并且绘制网络地图。人们可以从Sourceforge网站和@stake网站下载这一工具。NetCat是由一位前@stake员工所编写。
目前,@stake大约提供二十多种安全工具,工具种类涉及信息采集、证据收集、网络实用工具、口令审计、恢复与修补以及安全漏洞扫描等。其中,Andreas Junestam编写的WFPdisable、Paul Clip编写的AUSTIN、Frederic Bret-Mount开发的ComBust以及Ollie Whitehouse开发的WAP Assessment Tool都以保持最新状态而闻名
首先我们要弄明白netcat的工作原理,其实netcat的原理很简单,它就是从网络的一端读入数据,然后输出到网络的另一端,它可以使用tcp 和udp协议.之所以叫做netcat,因为它是网络上的cat,想象一下cat的功能,读出一个文件的内容,然后输出到屏幕上(默认的stdout是屏幕,当然可以重定向到其他地方).netcat也是如此,它读取一端的输入,然后传送到网络的另一端,
就这么简单.但是千万不要小看了它,netcat可以完成很多任务,,尤其是和其他程序组合时.好了,废话少说,进入正题吧.:p
网上有两种版本的netcat,一个是@stake公司的netcat,在
http://www.l0pht.com/~weld/netcat/
可以下载。
gnu的可以在 http://netcat.sourceforge.net/download.php 下载。
FreeBSD下的安装:
cvsup更新ports后,
# cd /usr/ports/net/netcat && make -s install distclean
安装好后,输入
nc或man nc,就可以看到相关信息了。
使用:
最简单的使用方法,”nc host port”,能建立一个TCP连接,连向指定的主机和端口。接下来,你的从标准输入中输入的任何内容都会被发送到指定的主机,任何通过连接返回来的信息都被显示在你的标准输出上。这个连接会一直持续下去,至到连接两端的程序关闭连接。注意,这种行为不同于大多数网络程序,它们会在从标准输入读到一个文件结束符后退出。
NetCat还可以当服务器使用,监听任意指定端口的连接请求(inbound connection),并可做同样的读写操作。除了较小限制外,它实际并不关心自己以“客户端”模式还是“服务器”模式运行,它都会来回运送全部数据。在任何一种模式下,都可以设置一个非活动时间来强行关闭连接。
它还可以通过UDP来完成这些功能,因此它就象一个telnet那样的UDP程序,用来测试你的UDP服务器。正如它的“U”所指的,UDP跟TCP相比是一种不可靠的数据传输,一些系统在使用UDP传送大量数据时会遇到麻烦,但它还有一些用途。
你可能会问“为什么不用telnet来连接任意的端口”?问题提得好(valid),这儿有一些理由。Telnet有“标准输入文件结束符 (standard input EOF)”问题,所以需要在脚本中延迟计算以便等待网络输出结束。这就是netcat持续运行直到连接被关闭的主要原因。Telnet也不能传输任意的二进制数据,因为一些特定的字符会被解释为Telnet的参数而被从数据流中去除。Telnet还将它的一些诊断信息显示到标准输出上,而NetCat会将这信息与它的输出分开以不改变真实数据的传输,除非你要求它这么做。当然了,Telnet也不能监听端口,也不能使用UDP。NetCat没有这些限制,比Telnet更小巧和快捷,而且还有一些其它的功能。
普通用户登录时:
-bash: /dev/null: Permission denied
-bash: /dev/null: 权限不够
[work@xmpan ~]$
但是可以登录但是执行命令的时候有如下情况:
[work@xmpan ~]$ ll
-bash: ll: command not found
[work@xmpan ~]$ ls -l
总计 251952
drwxr-xr-x 3 work work 4096 08-14 14:34 Desktop
-rw------- 1 work work 796 06-14 11:53 grub.conf
-rw-r--r-- 1 root root 25 06-01 12:28 key
查看/dev/null权限:
#ll /dev/null
crw------- 1 root root 1, 3 05-11 08:12 /dev/null
# rm /dev/null
rm:是否删除 字符特殊文件 “/dev/null”? y
# mknod -m 0666 /dev/null c 1 3
# ll /dev/null
crw-rw-rw- 1 root root 1, 3 05-11 08:28 /dev/null
问题都解决了,普通用户也可以使用ll
原因
用户本地的.bashrc内容为:
$cat /home/admin/.bashrc |more
# .bashrc
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
# User specific aliases and functions
$cat /etc/bashrc
截取其中一部分
for i in /etc/profile.d/*.sh; do
if [ -r "$i" ]; then
if [ "$PS1" ]; then
. $i
else
. $i >/dev/null 2>&1
fi
fi
done
我们使用普通用户登录时$PS2,所以应该执行
. $i >/dev/null 2>&1
普通用户对/dev/null没有权限,导致成功执行的输出无法输出,后面的配置失败,所以第一个执行这个语句的配置文件是成功的。然而:
# find /etc/profile.d/ |awk '/ls/ {print $0}'
/etc/profile.d/colorls.sh
/etc/profile.d/colorls.csh
# cat /etc/profile.d/colorls.sh |more
# color-ls initialization
alias ll='ls -l' 2>/dev/null
alias l.='ls -d .*' 2>/dev/null
COLORS=/etc/DIR_COLORS
[ -e "/etc/DIR_COLORS.$TERM" ] && COLORS="/etc/DIR_COLORS.$TERM"
[ -e "$HOME/.dircolors" ] && COLORS="$HOME/.dircolors"
[ -e "$HOME/.dir_colors" ] && COLORS="$HOME/.dir_colors"
[ -e "$HOME/.dircolors.$TERM" ] && COLORS="$HOME/.dircolors.$TERM"
[ -e "$HOME/.dir_colors.$TERM" ] && COLORS="$HOME/.dir_colors.$TERM"
[ -e "$COLORS" ] || return
eval `dircolors --sh "$COLORS" 2>/dev/null`
[ -z "$LS_COLORS" ] && return
if ! egrep -qi "^COLOR.*none" $COLORS >/dev/null 2>/dev/null ; then
alias ll='ls -l --color=tty' 2>/dev/null
alias l.='ls -d .* --color=tty' 2>/dev/null
alias ls='ls --color=tty' 2>/dev/null
fi
ll的alias没有被执行,或者执行失败,导致ll无法被识别。
-bash: /dev/null: Permission denied
-bash: /dev/null: 权限不够
[work@xmpan ~]$
但是可以登录但是执行命令的时候有如下情况:
[work@xmpan ~]$ ll
-bash: ll: command not found
[work@xmpan ~]$ ls -l
总计 251952
drwxr-xr-x 3 work work 4096 08-14 14:34 Desktop
-rw------- 1 work work 796 06-14 11:53 grub.conf
-rw-r--r-- 1 root root 25 06-01 12:28 key
查看/dev/null权限:
#ll /dev/null
crw------- 1 root root 1, 3 05-11 08:12 /dev/null
# rm /dev/null
rm:是否删除 字符特殊文件 “/dev/null”? y
# mknod -m 0666 /dev/null c 1 3
# ll /dev/null
crw-rw-rw- 1 root root 1, 3 05-11 08:28 /dev/null
问题都解决了,普通用户也可以使用ll
原因
用户本地的.bashrc内容为:
$cat /home/admin/.bashrc |more
# .bashrc
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
# User specific aliases and functions
$cat /etc/bashrc
截取其中一部分
for i in /etc/profile.d/*.sh; do
if [ -r "$i" ]; then
if [ "$PS1" ]; then
. $i
else
. $i >/dev/null 2>&1
fi
fi
done
我们使用普通用户登录时$PS2,所以应该执行
. $i >/dev/null 2>&1
普通用户对/dev/null没有权限,导致成功执行的输出无法输出,后面的配置失败,所以第一个执行这个语句的配置文件是成功的。然而:
# find /etc/profile.d/ |awk '/ls/ {print $0}'
/etc/profile.d/colorls.sh
/etc/profile.d/colorls.csh
# cat /etc/profile.d/colorls.sh |more
# color-ls initialization
alias ll='ls -l' 2>/dev/null
alias l.='ls -d .*' 2>/dev/null
COLORS=/etc/DIR_COLORS
[ -e "/etc/DIR_COLORS.$TERM" ] && COLORS="/etc/DIR_COLORS.$TERM"
[ -e "$HOME/.dircolors" ] && COLORS="$HOME/.dircolors"
[ -e "$HOME/.dir_colors" ] && COLORS="$HOME/.dir_colors"
[ -e "$HOME/.dircolors.$TERM" ] && COLORS="$HOME/.dircolors.$TERM"
[ -e "$HOME/.dir_colors.$TERM" ] && COLORS="$HOME/.dir_colors.$TERM"
[ -e "$COLORS" ] || return
eval `dircolors --sh "$COLORS" 2>/dev/null`
[ -z "$LS_COLORS" ] && return
if ! egrep -qi "^COLOR.*none" $COLORS >/dev/null 2>/dev/null ; then
alias ll='ls -l --color=tty' 2>/dev/null
alias l.='ls -d .* --color=tty' 2>/dev/null
alias ls='ls --color=tty' 2>/dev/null
fi
ll的alias没有被执行,或者执行失败,导致ll无法被识别。
背景:nc主要是用来在web这块做memcache的连接,再就是模拟一个tcp端口连接,然后做一些硬件上的调试,能看到发的数据之用。
更多实践:nc/ncat命令端口侦听在不同CentOS6/7的rpm包里有变化,linux nc命令传输文件(远程复制文件,传文件。),linux快速复制大量小文件方法 nc+tar。 http://jackxiang.com/post/9566/ http://jackxiang.com/post/3564/
[实践OK]nc (NetCat) 网络安全工具介绍,nc在centos里的rpm包叫啥?及查找方法。 http://jackxiang.com/post/3097/
nc -z -w 1 192.168.1*1.1*0 873 #测试rsync --daemon端口
经测试接收数据还能发出数据的,如下:
1)用nc建立服务器后,通过nc发送数据:
服务端:
客户端模拟提交给服务端数据:
cat /tmp/text.txt
模拟如下:
2)用telnet调试一点点发送数据测试:
服务端:
[root@iZ25z0ugwgtZ ~]# nc -l 1234
hello jack
this is a nc test...
客户端:
[root@iZ25z0ugwgtZ tmp]# telnet 101.200.189.210 1234
Trying 101.200.189.210...
Connected to 101.200.189.210.
Escape character is '^]'.
hello jack
this is a nc test...
==============================================================
centos安装netcat工具及测试:http://blog.csdn.net/nuli888/article/details/51867863
一、源码安装:
第一步:su - root
第二步:cd /相应目录
第三步:chmod -R 777 *
第四步:./ncsetup.sh
二、rpm包安装:nc在centos7上的安装和简单使用:
=========================================================
安装:
yum install nmap-ncat.x86_64
cat 123 |nc 192.168.1.10 8888
将标准输入转发到192.168.1.10的8888端口,,并将返回输出到标准输出
可以直接发送HTTP请求
$nc 192.168.1.10 80 <<EOF
GET / HTTP/1.0
EOF
即可显示首页内容
收发文件
发送方,读file文件,监听8888端口,等待连接后发送文件
cat file|nc -l -p 8888
接收方,连接11主机8888端口,将收到内容保存到file
nc 192.168.1.11 8888 >file
实践linux端口侦听,硬件发送数据到服务器上:
来自:http://blog.csdn.net/qq_16414307/article/details/50291341
=========================================
1.远程拷贝文件
从server1拷贝文件到server2上。需要先在server2上,,用nc激活监听,
server2上运行: nc -l 1234 > text.txt
server1上运行: nc 192.168.10.11 1234 < text.txt
注:server2上的监听要先打开
2.模拟HTTP Headers
引用[root@hatest1 ~]# nc 80
GET / HTTP/1.1
Host: ispconfig.org
Referrer: mypage.com
User-Agent: my-browser
HTTP/1.1 200 OK
Date: Tue, 16 Dec 2008 07:23:24 GMT
Server: Apache/2.2.6 (Unix) DAV/2 mod_mono/1.2.1 mod_python/3.2.8 Python/2.4.3 mod_perl/2.0.2 Perl/v5.8.8
Set-Cookie: PHPSESSID=bbadorbvie1gn037iih6lrdg50; path=/
Expires: 0
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Cache-Control: private, post-check=0, pre-check=0, max-age=0
Set-Cookie: oWn_sid=xRutAY; expires=Tue, 23-Dec-2008 07:23:24 GMT; path=/
Vary: Accept-Encoding
Transfer-Encoding: chunked
Content-Type: text/html
[......]
在nc命令后,输入红色部分的内容,然后按两次回车,即可从对方获得HTTP Headers内容。
以上两点在调试端口时常用,摘录自:http://blog.csdn.net/u010003835/article/details/52218362
更多实践:nc/ncat命令端口侦听在不同CentOS6/7的rpm包里有变化,linux nc命令传输文件(远程复制文件,传文件。),linux快速复制大量小文件方法 nc+tar。 http://jackxiang.com/post/9566/ http://jackxiang.com/post/3564/
[实践OK]nc (NetCat) 网络安全工具介绍,nc在centos里的rpm包叫啥?及查找方法。 http://jackxiang.com/post/3097/
nc -z -w 1 192.168.1*1.1*0 873 #测试rsync --daemon端口
经测试接收数据还能发出数据的,如下:
1)用nc建立服务器后,通过nc发送数据:
服务端:
客户端模拟提交给服务端数据:
cat /tmp/text.txt
模拟如下:
2)用telnet调试一点点发送数据测试:
服务端:
[root@iZ25z0ugwgtZ ~]# nc -l 1234
hello jack
this is a nc test...
客户端:
[root@iZ25z0ugwgtZ tmp]# telnet 101.200.189.210 1234
Trying 101.200.189.210...
Connected to 101.200.189.210.
Escape character is '^]'.
hello jack
this is a nc test...
==============================================================
centos安装netcat工具及测试:http://blog.csdn.net/nuli888/article/details/51867863
一、源码安装:
第一步:su - root
第二步:cd /相应目录
第三步:chmod -R 777 *
第四步:./ncsetup.sh
二、rpm包安装:nc在centos7上的安装和简单使用:
=========================================================
安装:
yum install nmap-ncat.x86_64
cat 123 |nc 192.168.1.10 8888
将标准输入转发到192.168.1.10的8888端口,,并将返回输出到标准输出
可以直接发送HTTP请求
$nc 192.168.1.10 80 <<EOF
GET / HTTP/1.0
EOF
即可显示首页内容
收发文件
发送方,读file文件,监听8888端口,等待连接后发送文件
cat file|nc -l -p 8888
接收方,连接11主机8888端口,将收到内容保存到file
nc 192.168.1.11 8888 >file
实践linux端口侦听,硬件发送数据到服务器上:
来自:http://blog.csdn.net/qq_16414307/article/details/50291341
=========================================
1.远程拷贝文件
从server1拷贝文件到server2上。需要先在server2上,,用nc激活监听,
server2上运行: nc -l 1234 > text.txt
server1上运行: nc 192.168.10.11 1234 < text.txt
注:server2上的监听要先打开
2.模拟HTTP Headers
引用[root@hatest1 ~]# nc 80
GET / HTTP/1.1
Host: ispconfig.org
Referrer: mypage.com
User-Agent: my-browser
HTTP/1.1 200 OK
Date: Tue, 16 Dec 2008 07:23:24 GMT
Server: Apache/2.2.6 (Unix) DAV/2 mod_mono/1.2.1 mod_python/3.2.8 Python/2.4.3 mod_perl/2.0.2 Perl/v5.8.8
Set-Cookie: PHPSESSID=bbadorbvie1gn037iih6lrdg50; path=/
Expires: 0
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Cache-Control: private, post-check=0, pre-check=0, max-age=0
Set-Cookie: oWn_sid=xRutAY; expires=Tue, 23-Dec-2008 07:23:24 GMT; path=/
Vary: Accept-Encoding
Transfer-Encoding: chunked
Content-Type: text/html
[......]
在nc命令后,输入红色部分的内容,然后按两次回车,即可从对方获得HTTP Headers内容。
以上两点在调试端口时常用,摘录自:http://blog.csdn.net/u010003835/article/details/52218362
Nokia的开源Qt开发工具正式发布了4.5版。如前所述,Qt 4.5最大的变动是换用LGPL许可证,目前采用的三个许可证分别为LGPL/GPL和商业许可证。阅读全文
最近装了个硬盘版的ubuntu 8.04,准备作为以后的嵌入式开发环境,其他一切基本弄好准备连接开发板启动时,出了问题。串口工具用的是minicom,但是连线开发板(FS2410)之后没有任何打印信息。因为所有的开发环境可以确认没有问题,所以初步判定为串口配置的问题。
在网上查找得知minicom串口设置,需设为 /dev/ttyUSB0, 但是我设只好之后之后,发现找不到/dev/ttyUSB0,然后自己在/dev下面也没找到ttyUSB0。于是lsusb查看可以确定系统可以检测到我的usb转串口线,
Bus 006 Device 001: ID 0000:0000
Bus 004 Device 003: ID 1a86:7523 USB转串口线
Bus 004 Device 001: ID 0000:0000
但是驱动无法识别,应该是驱动的问题。
于是在网上查找我的USB转串口线所用的IC,及其驱动。
先按照HL-340,搜到一些信息,其转换芯片应该是ch340或者ch341,但是目前大部分用的是ch341.于是我先查看自己的系统驱动模块,发现有ch341.ko,用modprobe ch341
加在之后,仍然无法在dmesg之下看到ttyUSB0相关信息
又在网上搜ch341之类的信息,终于找到一些有用的信息,发现起根本原因是原来的驱动程序中没有添加供应商ID和产品ID: "idVendor=1a86, idProduct=7523",所以需要在驱动源代码 ch341.c 中添加一行代码如下:
static struct usb_device_id id_table [] = {
{ USB_DEVICE(0x4348, 0x5523) },
{ USB_DEVICE(0x1a86, 0x7523) }, //新增代码 1a86,7523就是上文lsusb检测到的ID信息
{ },
};
具体的解决步骤总结如下:
(1)下载ch341驱动源码(系统里我没找到);
(2)在任意目录下解压源码;
(3)进入ch341源码根目录,用编辑器(比如: vi )打开ch341.c;
(4)在line29行找到上述结构体,并在其中添加 { USB_DEVICE(0x1a86, 0x7523) }, 保存并退出;
(5)在ch341源码根目录下执行make,即会生成ch341.ko
(6)进入到系统驱动模块存放目录将原来的ch341.ko删掉或者改为其他名字,比如改为:ch341.ko.old等(我的目录为: /lib/modules/2.6.24-19-generic/kernel/drivers/usb/serial/);
(7)将新编译好的ch341.ko复制到上述驱动模块的目录;
(8)加在驱动模块modprobe ch341;
(9)dmesg |grep usb,即可看到如下信息,表示usb转串口驱动成功;
[ 517.906465] /build/buildd/linux-2.6.24/drivers/usb/serial/usb-serial.c: USB Serial support registered for generic
[ 517.906969] usbcore: registered new interface driver usbserial_generic
[ 517.906976] /build/buildd/linux-2.6.24/drivers/usb/serial/usb-serial.c: USB Serial Driver core
[ 517.909771] /build/buildd/linux-2.6.24/drivers/usb/serial/usb-serial.c: USB Serial support registered for ch341-uart
[ 517.929627] usb 3-1: ch341-uart converter now attached to ttyUSB0
[ 517.929661] usbcore: registered new interface driver ch341
[ 1418.663675] usb 3-1: USB disconnect, address 5
[ 1486.350914] usb 4-1: new full speed USB device using uhci_hcd and address 3
[ 1486.385089] usb 4-1: configuration #1 chosen from 1 choice
[ 1486.404914] usb 4-1: ch341-uart converter now attached to ttyUSB0
[ 1608.650842] usbcore: deregistering interface driver ch341
[ 1608.653215] /build/buildd/linux-2.6.24/drivers/usb/serial/usb-serial.c: USB Serial deregistering driver ch341-uart
[ 1608.658300] usbcore: deregistering interface driver usbserial_generic
[ 1608.658348] /build/buildd/linux-2.6.24/drivers/usb/serial/usb-serial.c: USB Serial deregistering driver generic
(10)在/dev/目录下就可以找到ttyUSB0了,然后设置minicom串口为/dev/ttyUSB0,保存并退出。启动串口,上电开发板,顺利打印出串口信息。
http://linux.chinaunix.net/bbs/thread-1146827-1-1.html
http://blog.crox.net/archives/34-Using-the-HL-340-USB-serial-adapter-with-Linux-1a867523,-driver-ch341.html
驱动的代码下载地址:http://download.chinaprj.cn/link.php?key=iEDiriqb&url=http%3A%2F%2Fdlwt.csdn.net%2Ffd.php%3Fi%3D873519160285244%26s%3D8d11d8ef56e8d5fbe431448e8a6d7877
http://blog.chinaunix.net/u1/39518/showart_2081711.html
首先感谢如下链接的作者,你们解决问题的方法给了我个很大的帮助
CH340/CH341,USB转串口驱动模块
http://forum.ubuntu.org.cn/viewtopic.php?t=104478&sid=d8508d7fca76641dbac927c44a2d820d
增加新的设备ID { USB_DEVICE(0x1a86, 0x7523) }
https://bugs.launchpad.net/ubuntu/+source/linux/+bug/235459
再次感谢一下。
1、确认安装了linux-headers
2、进入ch341并编译文件,ch341在我的附件中
3、 modprobe usbserial && insmod ch341.ko
如果还有什么问题,请对应上文两个连接仔细研究一下
下载包:http://www.cublog.cn/u1/39518/showart_2081711.html
在网上查找得知minicom串口设置,需设为 /dev/ttyUSB0, 但是我设只好之后之后,发现找不到/dev/ttyUSB0,然后自己在/dev下面也没找到ttyUSB0。于是lsusb查看可以确定系统可以检测到我的usb转串口线,
Bus 006 Device 001: ID 0000:0000
Bus 004 Device 003: ID 1a86:7523 USB转串口线
Bus 004 Device 001: ID 0000:0000
但是驱动无法识别,应该是驱动的问题。
于是在网上查找我的USB转串口线所用的IC,及其驱动。
先按照HL-340,搜到一些信息,其转换芯片应该是ch340或者ch341,但是目前大部分用的是ch341.于是我先查看自己的系统驱动模块,发现有ch341.ko,用modprobe ch341
加在之后,仍然无法在dmesg之下看到ttyUSB0相关信息
又在网上搜ch341之类的信息,终于找到一些有用的信息,发现起根本原因是原来的驱动程序中没有添加供应商ID和产品ID: "idVendor=1a86, idProduct=7523",所以需要在驱动源代码 ch341.c 中添加一行代码如下:
static struct usb_device_id id_table [] = {
{ USB_DEVICE(0x4348, 0x5523) },
{ USB_DEVICE(0x1a86, 0x7523) }, //新增代码 1a86,7523就是上文lsusb检测到的ID信息
{ },
};
具体的解决步骤总结如下:
(1)下载ch341驱动源码(系统里我没找到);
(2)在任意目录下解压源码;
(3)进入ch341源码根目录,用编辑器(比如: vi )打开ch341.c;
(4)在line29行找到上述结构体,并在其中添加 { USB_DEVICE(0x1a86, 0x7523) }, 保存并退出;
(5)在ch341源码根目录下执行make,即会生成ch341.ko
(6)进入到系统驱动模块存放目录将原来的ch341.ko删掉或者改为其他名字,比如改为:ch341.ko.old等(我的目录为: /lib/modules/2.6.24-19-generic/kernel/drivers/usb/serial/);
(7)将新编译好的ch341.ko复制到上述驱动模块的目录;
(8)加在驱动模块modprobe ch341;
(9)dmesg |grep usb,即可看到如下信息,表示usb转串口驱动成功;
[ 517.906465] /build/buildd/linux-2.6.24/drivers/usb/serial/usb-serial.c: USB Serial support registered for generic
[ 517.906969] usbcore: registered new interface driver usbserial_generic
[ 517.906976] /build/buildd/linux-2.6.24/drivers/usb/serial/usb-serial.c: USB Serial Driver core
[ 517.909771] /build/buildd/linux-2.6.24/drivers/usb/serial/usb-serial.c: USB Serial support registered for ch341-uart
[ 517.929627] usb 3-1: ch341-uart converter now attached to ttyUSB0
[ 517.929661] usbcore: registered new interface driver ch341
[ 1418.663675] usb 3-1: USB disconnect, address 5
[ 1486.350914] usb 4-1: new full speed USB device using uhci_hcd and address 3
[ 1486.385089] usb 4-1: configuration #1 chosen from 1 choice
[ 1486.404914] usb 4-1: ch341-uart converter now attached to ttyUSB0
[ 1608.650842] usbcore: deregistering interface driver ch341
[ 1608.653215] /build/buildd/linux-2.6.24/drivers/usb/serial/usb-serial.c: USB Serial deregistering driver ch341-uart
[ 1608.658300] usbcore: deregistering interface driver usbserial_generic
[ 1608.658348] /build/buildd/linux-2.6.24/drivers/usb/serial/usb-serial.c: USB Serial deregistering driver generic
(10)在/dev/目录下就可以找到ttyUSB0了,然后设置minicom串口为/dev/ttyUSB0,保存并退出。启动串口,上电开发板,顺利打印出串口信息。
http://linux.chinaunix.net/bbs/thread-1146827-1-1.html
http://blog.crox.net/archives/34-Using-the-HL-340-USB-serial-adapter-with-Linux-1a867523,-driver-ch341.html
驱动的代码下载地址:http://download.chinaprj.cn/link.php?key=iEDiriqb&url=http%3A%2F%2Fdlwt.csdn.net%2Ffd.php%3Fi%3D873519160285244%26s%3D8d11d8ef56e8d5fbe431448e8a6d7877
http://blog.chinaunix.net/u1/39518/showart_2081711.html
首先感谢如下链接的作者,你们解决问题的方法给了我个很大的帮助
CH340/CH341,USB转串口驱动模块
http://forum.ubuntu.org.cn/viewtopic.php?t=104478&sid=d8508d7fca76641dbac927c44a2d820d
增加新的设备ID { USB_DEVICE(0x1a86, 0x7523) }
https://bugs.launchpad.net/ubuntu/+source/linux/+bug/235459
再次感谢一下。
1、确认安装了linux-headers
2、进入ch341并编译文件,ch341在我的附件中
3、 modprobe usbserial && insmod ch341.ko
如果还有什么问题,请对应上文两个连接仔细研究一下
下载包:http://www.cublog.cn/u1/39518/showart_2081711.html
source命令(从 C Shell 而来)是bash shell的内置命令。点命令,就是一个点符号,(从Bourne Shell而来)是source的另一名称。这两个命令都以一个脚本为参数,该脚本将作为当前shell的环境执行,即不会启动一个新的子进程。所有在脚本中设置的变量将成为当前Shell的一部分。同样的,当前脚本中设置的变量也将作为脚本的环境,source(或点)命令通常用于重新执行刚修改的初始化文件,如 .bash_profile 和 .profile 等等。例如,如果在登录后对 .bash_profile 中的 EDITER 和 TERM 变量做了修改,则可以用source命令重新执行 .bash_profile 中的命令而不用注销并重新登录。象 .bash_profile 或其它类似的Shell脚本这样,文件无需可执行权限即可用source或点命令执行。
source命令的一个妙用
在编译核心时,常常要反复输入一长串命令,如
make mrproper
make menuconfig
make dep
make clean
make bzImage
.......
这些命令既长,又繁琐。而且有时候容易输错,浪费你的时间和精力。如果把这些命令做成一个文件,让它自动按顺序执行,对于需要多次反复编译核心的用户来说,会很方便。用source命令可以办到这一点。它的作用就是把一个文件的内容当成是shell来执行。先在/usr/src/linux-2.4.20目录下建立一个文件,取名为make_command:
在其中输入如下内容:
make mrproper &&
make menuconfig &&
make dep &&
make clean &&
make bzImage &&
make modules &&
make modules_install &&
cp arch/i386/boot/bzImge /boot/vmlinuz_new &&
cp System.map /boot &&
vi /etc/lilo.conf &&
lilo -v
文件建立好之后,以后每次编译核心,只需要在/usr/src/linux- 2.4.20下输入
source make_command
就行了。这个文件也完全可以做成脚本,只需稍加改动即可。这里主要是让大家理解 source的用法。如果你用的不是lilo来引导系统,可以把最后两句话去掉。配置你自己的引导程序来引导新内核。
shell编程中的命令有时和C语言是一样的。&&表示与,||表示或。把两个命令用&&联接起来,如 make mrproper && make menuconfig ,表示要第一个命令执行成功才能执行第二个命令。对执行顺序有要求的命令能保证一旦有错误发生,下面的命令不会盲目地继续执行。
原文 :Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1451617
source命令的一个妙用
在编译核心时,常常要反复输入一长串命令,如
make mrproper
make menuconfig
make dep
make clean
make bzImage
.......
这些命令既长,又繁琐。而且有时候容易输错,浪费你的时间和精力。如果把这些命令做成一个文件,让它自动按顺序执行,对于需要多次反复编译核心的用户来说,会很方便。用source命令可以办到这一点。它的作用就是把一个文件的内容当成是shell来执行。先在/usr/src/linux-2.4.20目录下建立一个文件,取名为make_command:
在其中输入如下内容:
make mrproper &&
make menuconfig &&
make dep &&
make clean &&
make bzImage &&
make modules &&
make modules_install &&
cp arch/i386/boot/bzImge /boot/vmlinuz_new &&
cp System.map /boot &&
vi /etc/lilo.conf &&
lilo -v
文件建立好之后,以后每次编译核心,只需要在/usr/src/linux- 2.4.20下输入
source make_command
就行了。这个文件也完全可以做成脚本,只需稍加改动即可。这里主要是让大家理解 source的用法。如果你用的不是lilo来引导系统,可以把最后两句话去掉。配置你自己的引导程序来引导新内核。
shell编程中的命令有时和C语言是一样的。&&表示与,||表示或。把两个命令用&&联接起来,如 make mrproper && make menuconfig ,表示要第一个命令执行成功才能执行第二个命令。对执行顺序有要求的命令能保证一旦有错误发生,下面的命令不会盲目地继续执行。
原文 :Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1451617