Youmai の Blog


  • 首页

  • 分类

  • 关于

  • 归档

  • 标签

diff比较两个文件夹

发表于 2015-03-20 | 分类于 linux

diff -urNa dir1 dir2

-a: Treat all files as text and compare them line-by-line, even if they do not seem to be text.

-N: In directory comparison, if a file is found in only one directory, treat it as present but empty in the other directory.

-r: When comparing directories, recursively compare any subdirectories found.

-u: Use the unified output format.

DNS原理及其解析过程

发表于 2015-03-19 | 分类于 网络

网络通讯大部分是基于TCP/IP的,而TCP/IP是基于IP地址的,所以计算机在网络上进行通讯时只能识别如202.96.134.133之类的IP地址,而不能认识域名。我们无法记住10个以上网站的IP地址,所以我们访问网站时,更多的是在浏览器地址栏中输入域名,就能看到所需要的页面,这是因为有一个叫DNS服务器的计算机自动把我们的域名“翻译”成了相应的IP地址,然后调出IP地址所对应的网页。

##什么是DNS
DNS( Domain Name System)是域名系统的英文缩写,是一种组织成域层次结构的计算机和网络服务命名系统,它用于TCP/IP网络,它所提供的服务是用来将主机名和域名转换为IP地址的工作。DNS就是这样的一位“翻译官”,它的基本工作原理可用下图来表示。

##DNS使用的协议
DNS同时占用UDP和TCP端口53是公认的,这种单个应用协议同时使用两种传输协议的情况在TCP/IP栈也算是个另类。但很少有人知道DNS分别在什么情况下使用这两种协议。

DNS在进行区域传输的时候使用TCP协议,其它时候则使用UDP协议;

DNS的规范规定了2种类型的DNS服务器,一个叫主DNS服务器,一个叫辅助DNS服务器。在一个区中主DNS服务器从自己本机的数据文件中读取该区的DNS数据信息,而辅助DNS服务器则从区的主DNS服务器中读取该区的DNS数据信息。当一个辅助DNS服务器启动时,它需要与主DNS服务器通信,并加载数据信息,这就叫做区传送(zone transfer)。

为什么既使用TCP又使用UDP?

首先了解一下TCP与UDP传送字节的长度限制:

UDP报文的最大长度为512字节,而TCP则允许报文长度超过512字节。当DNS查询超过512字节时,协议的TC标志出现删除标志,这时则使用TCP发送。通常传统的UDP报文一般不会大于512字节。

区域传送时使用TCP,主要有一下两点考虑:

  1. 辅域名服务器会定时(一般时3小时)向主域名服务器进行查询以便了解数据是否有变动。如有变动,则会执行一次区域传送,进行数据同步。区域传送将使用TCP而不是UDP,因为数据同步传送的数据量比一个请求和应答的数据量要多得多。
  2. TCP是一种可靠的连接,保证了数据的准确性。

域名解析时使用UDP协议:

客户端向DNS服务器查询域名,一般返回的内容都不超过512字节,用UDP传输即可。不用经过TCP三次握手,这样DNS服务器负载更低,响应更快。虽然从理论上说,客户端也可以指定向DNS服务器查询的时候使用TCP,但事实上,很多DNS服务器进行配置的时候,仅支持UDP查询包。

##DNS的查询过程

  1. 在浏览器中输入www.qq.com域名,操作系统会先检查自己本地的hosts文件是否有这个网址映射关系,如果有,就先调用这个IP地址映射,完成域名解析。
  2. 如果hosts里没有这个域名的映射,则查找本地DNS解析器缓存,是否有这个网址映射关系,如果有,直接返回,完成域名解析。
  3. 如果hosts与本地DNS解析器缓存都没有相应的网址映射关系,首先会找TCP/ip参数中设置的首选DNS服务器,在此我们叫它本地DNS服务器,此服务器收到查询时,如果要查询的域名,包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析,此解析具有权威性。
  4. 如果要查询的域名,不由本地DNS服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析,此解析不具有权威性。
  5. 如果本地DNS服务器本地区域文件与缓存解析都失效,则根据本地DNS服务器的设置(是否设置转发器)进行查询,如果未用转发模式,本地DNS就把请求发至13台根DNS,根DNS服务器收到请求后会判断这个域名(.com)是谁来授权管理,并会返回一个负责该顶级域名服务器的一个IP。本地DNS服务器收到IP信息后,将会联系负责.com域的这台服务器。这台负责.com域的服务器收到请求后,如果自己无法解析,它就会找一个管理.com域的下一级DNS服务器地址(qq.com)给本地DNS服务器。当本地DNS服务器收到这个地址后,就会找qq.com域服务器,重复上面的动作,进行查询,直至找到www.qq.com主机。
  6. 如果用的是转发模式,此DNS服务器就会把请求转发至上一级DNS服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根DNS或把转请求转至上上级,以此循环。不管是本地DNS服务器用是是转发,还是根提示,最后都是把结果返回给本地DNS服务器,由此DNS服务器再返回给客户机。

能够关闭(close)一个套接字,为何还使用shutdown

发表于 2015-03-17 | 分类于 unix网络编程
  1. 只有一个最后一个活动关闭时,close才释放网络断点。这意味着如果复制一个套接字(如采用dup),要直到关闭了最后一个引用它的文件描述符才会释放这个套接字。而shutdown允许使一个套接字处于不活动状态,和引用它的文件描述符无关

  2. 有时可以很方便地关闭套接字双向传输中的一个方向。例如,如果想让所通信的进程能够确定数据传输何时结束,可以关闭该套接字的写段,然而通过该套接字读端仍可以继续接受数据

注意:

在unix中调用了shutdown后,以shutdown(s, 0)为例,此函数为关闭s的接收端,unix会刷新输入队列,以丢弃应用程序还未读取的所有数据。如果有新数据到达,TCP会进行ACK,然后悄悄地将其丢弃。因为应用程序再也无法接收数据了

shutdown(s,1)关闭连接的发送端。将套接字标识为无法发送任何额外的数据,后继所有试图对套接字进行的写操作都会出错。将发送缓冲区中所有的数据都发送出去之后,TCP会向其对等实体发送一个FIN,通知它没有其他数据了。这被称为半关闭(half close)

只有关闭连接的发送端被称为半关闭,它虽然也发送FIN,但此FIN与close的FIN有差别,这个FIN表示的是“我已经完成了数据的传送,因此发送一个FIN到另一端,但我还想接收另一端发来的消息,直到他给我发来文件结束(FIN)

海量数据处理

发表于 2015-03-16 | 分类于 算法

转载自这里

##海量日志数据,提取出某日访问百度次数最多的那个IP。

算法思想:分而治之+Hash

  1. IP地址最多有2^32=4G种取值情况,所以不能完全加载到内存中处理;
  2. 可以考虑采用“分而治之”的思想,按照IP地址的Hash(IP)%1024值,把海量IP日志分别存储到1024个小文件中。这样,每个小文件最多包含4MB个IP地址;
  3. 对于每一个小文件,可以构建一个IP为key,出现次数为value的Hash map,同时记录当前出现次数最多的那个IP地址;
  4. 可以得到1024个小文件中的出现次数最多的IP,再依据常规的排序算法得到总体上出现次数最多的IP;

##给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?

方法:可以估计每个文件安的大小为5G×64=320G,远远大于内存限制的4G。所以不可能将其完全加载到内存中处理。考虑采取分而治之的方法。

  1. 遍历文件a,对每个url求取hash(url)%1000,然后根据所取得的值将url分别存储到1000个小文件中(每个小文件存放的是经过hash(url)%1000计算后结果相同的url),记为a1a2a3...a999。这样每个小文件的大约为300M。
  • 遍历文件b,采取和a相同的方式将url分别存储到1000小文件中,记为b1b2b3...b999。这样处理后,所有可能相同的url都在对应的小文件中,a1->b1,a2->b2,...,a999->b999,不对应的小文件不可能有相同的url(相同的url的hash(url)%1000的值也必然相等)。然后我们只要求出1000对小文件中相同的url即可。

  • 求每对小文件中相同的url时,可以把其中一个小文件的url存储到hash_set中。然后遍历另一个小文件的每个url,看其是否在刚才构建的hash_set中,如果是,那么就是共同的url,存到文件里面就可以了。

注意点:

  1. hash后要判断每个文件大小,如果hash分的不均衡有文件较大,还应继续hash分文件,换个hash算法第二次再分较大的文件,一直分到没有较大的文件为止。这样文件标号可以用A1-2表示(第一次hash编号为1,文件较大所以参加第二次hash,编号为2)
  2. 由于1存在,第一次hash如果有大文件,不能用直接set的方法。建议对每个文件都先用字符串自然顺序排序,然后具有相同hash编号的(如都是1-3,而不能a编号是1,b编号是1-1和1-2),可以直接从头到尾比较一遍。对于层级不一致的,如a1,b有1-1,1-2-1,1-2-2,层级浅的要和层级深的每个文件都比较一次,才能确认每个相同的url。

##有10个文件,每个文件1G,每个文件的每一行存放的都是用户的query,每个文件的query都可能重复。要求你按照query的频度排序。

方案1:

  1. 顺序读取10个文件,按照hash(query)%10的结果将query写入到另外10个文件中。这样新生成的文件每个的大小大约也1G(假设hash函数是随机的)。
  • 找一台内存在2G左右的机器,依次对1中生成的10个文件用hash_map(query, query_count)来统计每个query出现的次数。利用快速/堆/归并排序按照出现次数进行排序。将排序好的query和对应的query_cout输出到文件中。这样得到了10个排好序的文件。
  • 对这10个文件进行归并排序(内排序与外排序相结合)。

方案2:

一般query的总量是有限的,只是重复的次数比较多而已,可能对于所有的query,一次性就可以加入到内存了。这样,我们就可以采用trie树/hash_map等直接来统计每个query出现的次数,然后按出现次数做快速/堆/归并排序就可以了

##寻找热门查询:

搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。假设目前有一千万个记录,这些查询串的重复读比较高,虽然总数是1千万,但是如果去除重复和,不超过3百万个。一个查询串的重复度越高,说明查询它的用户越多,也就越热门。请你统计最热门的10个查询串,要求使用的内存不能超过1G。

  1. 先对这批海量数据预处理,在O(N)的时间内用Hash表完成统计;
  2. 借助堆这个数据结构,找出Top K,时间复杂度为N'*logK。即,借助堆结构,我们可以在log量级的时间内查找和调整/移动。因此,维护一个K(该题目中是10)大小的小根堆,然后遍历300万的Query,分别和根元素进行对比所以,我们最终的时间复杂度是:O(N) + N'*O(logK),(N为1000万,N’为300万)。

##有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16字节,内存限制大小是1M。返回频数最高的100个词。

方案1:

  1. 顺序读文件中,对于每个词x,取hash(x)%5000,然后按照该值存到5000个小文件中。这样每个文件大概是200k左右。如果其中的有的文件超过了1M大小,还可以按照类似的方法继续往下分,直到分解得到的小文件的大小都不超过1M。
  • 对每个小文件,统计每个文件中出现的词以及相应的频率(可以采用trie树/hash_map等),并取出出现频率最大的100个词(可以用含100个结点的最小堆),并把100词及相应的频率存入文件,这样又得到了5000个文件。
  • 把这5000个文件进行归并(类似于归并排序)排序。

##在2.5亿个整数中找出不重复的整数,内存不足以容纳这2.5亿个整数。

方案1:采用2-Bitmap(每个数分配2bit,00表示不存在,01表示出现一次,10表示多次,11无意义)进行,共需内存2^32*2bit=1GB内存,还可以接受。然后扫描这2.5亿个整数,查看Bitmap中相对应位,如果是00变01,01变10,10保持不变。所描完事后,查看bitmap,把对应位是01的整数输出即可。

方案2:也可采用上题类似的方法,进行划分小文件的方法。然后在小文件中找出不重复的整数,并排序。然后再进行归并,注意去除重复的元素。

##腾讯面试题:给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?

方案1:申请512M(512*1024*1024*8 = 40亿bit)的内存,一个bit位代表一个unsigned int值。读入40亿个数,设置相应的bit位,读入要查询的数,查看相应bit位是否为1,为1表示存在,为0表示不存在。

方案2:这个问题在《编程珠玑》里有很好的描述,大家可以参考下面的思路,探讨一下:

因为2^32为40亿多,所以给定一个数可能在,也可能不在其中;
这里我们把40亿个数中的每一个用32位的二进制来表示
假设这40亿个数开始放在一个文件中。

然后将这40亿个数分成两类:

  1. 最高位为0
  2. 最高位为1

并将这两类分别写入到两个文件中,其中一个文件中数的个数<=20亿,而另一个>=20亿(这相当于折半了);与要查找的数的最高位比较并接着进入相应的文件再查找

再然后把这个文件为又分成两类:

  1. 次最高位为0
  2. 次最高位为1

并将这两类分别写入到两个文件中,其中一个文件中数的个数<=10亿,而另一个>=10亿(这相当于折半了);

与要查找的数的次最高位比较并接着进入相应的文件再查找。

…….

以此类推,就可以找到了,而且时间复杂度为O(logn),方案2完。

附:这里,再简单介绍下,位图方法:

使用位图法判断整形数组是否存在重复
判断集合中存在重复是常见编程任务之一,当集合中数据量比较大时我们通常希望少进行几次扫描,这时双重循环法就不可取了。

位图法比较适合于这种情况,它的做法是按照集合中最大元素max创建一个长度为max+1的新数组,然后再次扫描原数组,遇到几就给新数组的第几位置上1,如遇到5就给新数组的第六个元素置1,这样下次再遇到5想置位时发现新数组的第六个元素已经是1了,这说明这次的数据肯定和以前的数据存在着重复。这种给新数组初始化时置零其后置一的做法类似于位图的处理方法故称位图法。它的运算次数最坏的情况为2N。如果已知数组的最大值即能事先给新数组定长的话效率还能提高一倍。

##海量数据分布在100台电脑中,想个办法高效统计出这批数据的TOP10。

方案1:

  1. 在每台电脑上求出TOP10,可以采用包含10个元素的堆完成(TOP10小,用最大堆,TOP10大,用最小堆)。比如求TOP10大,我们首先取前10个元素调整成最小堆,如果发现,然后扫描后面的数据,并与堆顶元素比较,如果比堆顶元素大,那么用该元素替换堆顶,然后再调整为最小堆。最后堆中的元素就是TOP10大。
  • 求出每台电脑上的TOP10后,然后把这100台电脑上的TOP10组合起来,共1000个数据,再利用上面类似的方法求出TOP10就可以了。

##怎么在海量数据中找出重复次数最多的一个?

方案1:先做hash,然后求模映射为小文件,求出每个小文件中重复次数最多的一个,并记录重复次数。然后找出上一步求出的数据中重复次数最多的一个就是所求(具体参考前面的题)。

##上千万或上亿数据(有重复),统计其中出现次数最多的前N个数据。

方案1:上千万或上亿的数据,现在的机器的内存应该能存下。所以考虑采用hash_map/搜索二叉树/红黑树等来进行统计次数。然后就是取出前N个出现次数最多的数据了,可以用堆机制完成。

##1000万字符串,其中有些是重复的,需要把重复的全部去掉,保留没有重复的字符串。请怎么设计和实现?

方案1:这题用trie树比较合适,hash_map也应该能行。

##一个文本文件,大约有一万行,每行一个词,要求统计出其中最频繁出现的前10个词,请给出思想,给出时间复杂度分析。

方案1:这题是考虑时间效率。用trie树统计每个词出现的次数,时间复杂度是O(n*le)(le表示单词的平准长度)。然后是找出出现最频繁的前10个词,可以用堆来实现,前面的题中已经讲到了,时间复杂度是O(n*lg10)。所以总的时间复杂度,是O(n*le)与O(n*lg10)中较大的哪一个。

##一个文本文件,找出前10个经常出现的词,但这次文件比较长,说是上亿行或十亿行,总之无法一次读入内存,问最优解。

方案1:首先根据用hash并求模,将文件分解为多个小文件,对于单个文件利用上题的方法求出每个文件件中10个最常出现的词。然后再进行归并处理,找出最终的10个最常出现的词。

##100w个数中找出最大的100个数。

方案1:在前面的题中,我们已经提到了,用一个含100个元素的最小堆完成。复杂度为O(100w*lg100)。

删除list里的重复元素

发表于 2015-03-15 | 分类于 python

##方法一:先排序后比较大小

if List:
    List.sort()
last = List[-1]
for i in range(len(List)-2, -1, -1):
    if last==List[i]: 
        del List[i]
    else: 
        last=List[i]

问题:为什么要从后往前迭代呢?我们可以从list[0]开始啊,代码如下:

if List:
    List.sort()
begin = List[0]
for i in range(1, len(list)):
    if begin==List[i]: 
        del List[i]
    else: 
        begin=List[i]

运行一下,报错如下:

IndexError: list index out of range

数组访问越界了!why?

我们调用del删除list里的元素,相应的list的长度也会自动减小,但我们迭代的范围range(1, len(list))是一开始就计算好的,所以必然会越界。比如说:

li = [1,1,2,2,3,3,3,4,5,6]

调用len计算得到li的长度为10,range(1,10)得到我们迭代的序列是1-9,但是当我们删除了li中的重复元素1,2,3之后,li的长度只剩下了6,可是我们依然会访问li[7],因为访问序列一开始就计算好了,所以必然造成了越界。

那从后向前是如何避免越界的呢?从后向前遍历,删除元素后,只是把这个元素之后的已经没有重复元素的序列向前移动一位,数组依然在变短,但这个时候是不会影响到我们向前遍历的。

##方法二:使用set

>>> li = [1,2,4,5,7,8,2,3,4,56,7]
>>> list(set(li))
>>> [1, 2, 3, 4, 5, 7, 8, 56]

##方法三:使用列表综合

l1 = ['b','c','d','b','c','a','a']  
l2 = []  
[l2.append(i) for i in l1 if not i in l2]  
print l2

tcp是流的一些思考--拆包和粘包

发表于 2015-03-13 | 分类于 TCP/IP

假设应用层协议是http

我从浏览器中访问了一个网站,网站服务器给我发了200k的数据。建立连接的时候,通告的MSS是50k,所以为了防止ip层分片,tcp每次只会发送50k的数据,一共发了4个tcp数据包。如果我又访问了另一个网站,这个网站给我发了100k的数据,这次tcp会发出2个包,问题是,客户端收到6个包,怎么知道前4个包是一个页面,后两个是一个页面。既然是tcp将这些包分开了,那tcp会将这些包重组吗,它送给应用层的是什么?

这是我自己想的一个场景,正式一点讲的话,这个现象叫拆包。

我们再考虑一个问题。

tcp中有一个negal算法,用途是这样的:通信两端有很多小的数据包要发送,虽然传送的数据很少,但是流程一点没少,也需要tcp的各种确认,校验。这样小的数据包如果很多,会造成网络资源很大的浪费,negal算法做了这样一件事,当来了一个很小的数据包,我不急于发送这个包,而是等来了更多的包,将这些小包组合成大包之后一并发送,不就提高了网络传输的效率的嘛。这个想法收到了很好的效果,但是我们想一下,如果是分属于两个不同页面的包,被合并在了一起,那客户那边如何区分它们呢?

这就是粘包问题。

从粘包问题我们更可以看出为什么tcp被称为流协议,因为它就跟水流一样,是没有边界的,没有消息的边界保护机制,所以tcp只有流的概念,没有包的概念。

我们还需要有两个概念

  • 长连接: Client方与Server方先建立通讯连接,连接建立后不断开, 然后再进行报文发送和接收。
  • 短连接:Client方与Server每进行一次报文收发交易时才进行通讯连接,交易完毕后立即断开连接。此种方式常用于一点对多点 通讯,比如多个Client连接一个Server.

下面我们揭晓答案:

  1. 我想象的关于粘包的场景是不对的,http连接是短连接,请求之后,收到回答,立马断开连接,不会出现粘包。
  2. 拆包现象是有可能存在的

##处理拆包
既然拆包现象可能存在,如果遇到了,那么该如何处理呢?这里提供两种方法

  1. 通过包头+包长+包体的协议形式,当服务器端获取到指定的包长时才说明获取完整。
  2. 指定包的结束标识,这样当我们获取到指定的标识时,说明包获取完整。

##处理粘包
我们从上面的分析看到,虽然像http这样的短连接协议不会出现粘包的现象,但是一旦建立了长连接,粘包还是有可能会发生的。

网上的处理方法有很多,这里不列举了,但大家看这些处理方法,都会发现,这些方法并不好,都会做一些牺牲。比如禁用negal算法,就是以网络性能作为牺牲。

一些阿里面试题

发表于 2015-03-12 | 分类于 面试

##内存泄露最终的结果在操作系统中的表现是什么?
内存泄漏形象的比喻是“操作系统可提供给所有进程的存储空间正在被某个进程榨干”,最终结果是程序运行时间越长,占用存储空间越来越多,最终用尽全部存储空间,整个系统崩溃。所以“内存泄漏”是从操作系统的角度来看的。这里的存储空间并不是指物理内存,而是指虚拟内存大小,这个虚拟内存大小取决于磁盘交换区设定的大小。由程序申请的一块内存,如果没有任何一个指针指向它,那么这块内存就泄漏了。

从用户使用程序的角度来看,内存泄漏本身不会产生什么危害,作为一般的用户,根本感觉不到内存泄漏的存在。真正有危害的是内存泄漏的堆积,这会最终消耗尽系统所有的内存。从这个角度来说,一次性内存泄漏并没有什么危害,因为它不会堆积,而隐式内存泄漏危害性则非常大,因为较之于常发性和偶发性内存泄漏它更难被检测到。

##malloc-free和new-delete的区别

malloc-free是c/c++中的函数,new-delete是c++中的运算符

##怎么知道http首部结束了?

http首部由一个空行结束,也就是\r\n\r\n,表明了首部的结束和实体主体的开始。

实体的主体部分包含一个由任意数据组成的数据块。并不是所有的报文都包含实体的主体部分。如GET请求就不包含实体。

##tcpdump抓包是在哪一层?

Linux下抓取报文的位置,是在链路层处理报文之后,交给网络层之前的位置。

##同一端口可否同时被两个应用监听?
不可以,但是fork的子进程用netstat看确实和父进程监听在同一端口,但是这和两个独立的进程应该是有所区别的

同一机器上的应用如果监听在同一端口,那socket的四元组就是一样的了,这是不可能的

##查看命令的帮助文档的命令

  • man是查看本地
  • info是查看在线

##谁在决定是使用Big-endian,还是Little-endian?

在计算存储中是CPU,也就是CPU的体系结构,还是有点抽象啊。比如x86的是小端,power-pc的是大端。

##线性表的顺序结构和链表结构各有什么优缺点

  • 顺序结构:

    • 优点:易于查询,索引快 list[n]这样的操作,O(1)复杂度
    • 缺点:扩展性弱,不易删除、添加。
  • 链表结构:

    • 优点:扩展性强,易于删除、添加
    • 缺点:不易于查询,索引慢,list[n]这样的操作,复杂度为O(n)

##shell的if和for语句

if语句

if condition;
then
    commands
fi

for语句

for i in ***; do
commands
done

print0 && xargs

发表于 2015-03-12 | 分类于 linux

awk和sed之前看过,好久不用又忘记了,也没有总结,所以要学习还得再上网找资料,索性自己来总结一下。-print0和xargs之前一直在用,但是模模糊糊,一知半解,今天一并解决。

##-print

  1. -print是find命令的一个参数,别的命令是没有的(我没见过,说错了请大家指正)
  2. -print0是-print的一个形态,也可以不加最后的0

-print指明打印出匹配文件的文件名。当使用-print时,’\n’作为用于输出的文件名进行分隔。

-print0指明使用’\0’作为匹配的文件名之间的定界符。

##xargs

我们可以用管道将一个命令的stdout重定向到另一个命令的stdin。例如:

command | grep "text"

但是有些命令只能以命令行参数的形式接受数据,而无法通过stdin接受数据流。在这种情况下,我们无法用管道来提供哪些只有通过命令行参数才能提供的数据。

只是就只能另辟蹊径了。该xargs命令上场了,他擅长将标准输入数据转换成命令行参数。xargs能够处理stdin并将其转换成特定命令的命令行参数。xargs也可以将单行或多行文本输入转换成其他格式,例如单行变多行或多行变单行。

xargs应该紧跟在管道操作符之后,以标注输入作为主要的原数据流

command | xargs 

例如:删除path路径下的所有文件

rm `find /path -type f`

如果path目录下文件过多就会因为“参数列表过长”而报错无法执行。但改用xargs以后,问题即获解决。

find /path -type f -print0 | xargs -0 rm

xargs将find产生的长串文件列表拆散成多个子串,然后对每个子串调用rm。

awk和sed的东西比较多,为了避免文章太长,另外写吧

用crontab定期执行脚本

发表于 2015-03-12 | 分类于 linux

#用crontab定期执行脚本

一个完整的步骤是:

cd /etc/cron.d  //此目录下存放的是所有定期执行的cron文件
crontab -e //建立一个新的定时任务

大功告成!
就是这么简单,但我遇到了很多坑啊!

  • 我在task.croon里是这么写的

    */1 * * * * /root/test/time.sh
    

    我翻来覆去地看,和网上写的一样啊,怎么就是不执行呢?md,对的是这么写啊!

    */1 * * * *  root /root/test/time.sh
    

    你掉了一个字段啊,root给你吃了吗!你放在/etc/cron.d下面就是要加执行者这个字段的啊!

看看/etc/crontab

# Example of job definition:
  # .---------------- minute (0 - 59)
  # |  .------------- hour (0 - 23)
  # |  |  .---------- day of month (1 - 31)
  # |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
  # |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
  # |  |  |  |  |
  # *  *  *  *  * user-name command to be executed

人家指明了要加user-name看到木有啊!!!

  • 我在time.sh里面又是怎么写的呢?

    /bin/date 
    

然后我就在电脑前等一分钟等他在终端给我打印了。我刷了会儿知乎,一看电脑,过了2分钟了,看看黑框框,说好的打印呢!!!啥都没有啊!!!

有了就见鬼了,我最近怎么就蠢成这样了呢!!!

这是一个后台任务啊,哪有终端啊,能不能重定向到标准输出呢?它根本没有标准输出你知道不知道,知道不知道!!!

想看结果重定向到文件里去啊!!!

/bin/date >>/tmp/log

用/proc收集信息

发表于 2015-03-12
  • 获取cpu信息

    cat /proc/cpuinfo
    
  • 获取内存信息:

    cat /proc/meminfo
    
  • 获取分区信息:

    cat /proc/partitions
    

每一个运行的进程在/proc下都有一个以该进程id命名的目录,
/proc/PID/下的重要文件:

  • environ:包含与进程相关的环境变量;
  • exe:到进程工作目录的符号链接;
  • fd:进程所使用的文件描述符
1…8910…18
You Wangqiu

You Wangqiu

世之奇伟、瑰怪,非常之观,常在于险远,而人之所罕至焉,故非有志者不能至也

171 日志
21 分类
24 标签
GitHub 知乎 E-Mail
© 2018 You Wangqiu
由 Hexo 强力驱动
主题 - NexT.Muse