• exchange + AD

    很厉害

  • 还不错

  • 储存

    即使应用程序被切分成服务,存储上仍然存在非常大的瓶颈。这时的 Twitter 使用的还是一个主 MySQL 数据库,为此我们采取了临时策略——将每条 tweet 都储存为数据库中的一行并进行顺序存储,当数据库容量耗尽时会建立一个新的数据库,并在应用中进行配置。这个策略为我们争取到了一定的时间,但是峰值时的 tweet 吞吐量瓶颈依然存在,因为他们总是被顺序的存储到一个单独的数据库主节点中,所以读负载只被分担到一小部分的数据库主机中。因此,我们需要为 Tweet 的存储选择一个不同的分片策略。

    我们开发了 Gizzard,帮助我们建立分片及容错的分布式数据库,用它来服务 tweet。我们还建立了 T-Bird。这种情况下,Gizzard 需要处理大量的 MySQL 数据库——当 tweet 被传入系统时,Gizzard 会首先得到它,然后选择一个合适的数据库。当然,这就意味丧失了 MySQL 的唯一 ID 生成能力。Snowflake 被开发用以解决这个问题,它可以帮助建立 tweet 的 ID。一旦有了标识符,就可以依靠 Gizzard 进行存储。如果哈希算法非常有效,并且 tweet 接近均匀分布,那么就可以通过增加目标数据库的数量来提高吞吐量。读取同样均匀的分布在整个集群上,而不是被绑在 “最近” 的数据库上,这同样是高吞吐量的保障。

    可观察及统计

    虽然已经对整体应用程序进行更健壮的封装,但是依然存在很多复杂性。为了管理如此规模的应用程序,工具也是个煞费苦心的领域。鉴于新服务的发布速度,快速收集每个服务运行数据的能力是必不可少的。一般情况下,我们希望做数据驱动策略,所以必须无缝获得尽可能详细的数据。

    鉴于我们需要在一个不断变大的系统上建立越来越多的服务,我们必须让这个操作变得非常简单。为此,Runtime Systems 团队为工程师建立了两个工具:Viz 和 Zipkin。这两个工具都对 Finagle 可见并与之整合,这样所有使用 Finagle 建立的系统都可以自动通信。

    stats.timeFuture("request_latency_ms") { // dispatch to do work } 如上显示,一个服务通过短短的 3 行代码就可以给 Viz 报告统计信息。这样一来,任何人使用 Viz 都可以查询自己感兴趣的数据,比如 request_latency_ms 中第 55 和 99 百分位数据。

    运行时配置和测试

    最后,当我们实现以上所有步骤时,却遭遇了两个看似无关紧要的障碍:发布特性必须在不同的服务之间做一系列协调,而 Twitter 的规模之也导致服务阶段测试能力的丧失。依赖部署去开启用户层代码已不再可行,取而代之的是必须在整个应用程序上做协调;此外,考虑到 Twitter 的相对体积,在整个隔离环境下进行有意义的测试变得非常困难。相对而言,我们并没有在隔离系统中进行测试——我们使用了运行时配置来应对。

    我们在服务中整合了被称为 Decider 的系统,它允在服务中改变发生时,以近实时的方式将这个改变扩散到整个系统。这意味着一旦准备就绪,软件和多个系统就可以投入使用。然而一个特性不应该是 “神出鬼没” 的,Decider 同样允许我们灵活的去做基于二进制或者百分位的转换,比如让某个特性只针对百分之多少的传输或者用户生效。我们可以将代码配置成完全 “off” 或者是安全设置,然后逐渐的将它打开或者关闭,直到可以确信它正常工作并且系统可以支撑新的负载。这样做可以降低队伍之间协调的工作量,取而代之的是我们在运行时进行设置。

    Twitter 系统的现状

    比之 3 年前,当下 Twitter 系统的性能、有效性和可靠性都得到了显著提高,从下图不难看到,大部分情况下,网站的性能都得到了大幅度提升,然而机器的数量却减少了 5 至 12 倍。过去 6 个月,服务的可用性更达到了 4 个 9(99.99%)。

    模仿软件堆栈去设置工程团队,让团队长期获得一个服务的所有权,有助于这部分基础设施专家的形成。团队有着自己的接口及问题域,举个例子:不是所有的团队都需要去关心 tweet 的扩展问题,只有涉及 tweet 子系统(tweet 服务团队、储存团队、缓存团队等)运行的团队必须去扩展 tweet 的写入和读出,其它的团队只需要懂得使用现成的 API 就可以了。

  • JVM 与 Ruby Vm

    首先我们从 CPU、RAM 及网络三个角度评估了前端服务器层,我们发现基于 Ruby 的架构明显受限于 CPU 和内存,然而单机器的请求并没有达到,网络带宽同样也没有接近饱和。在那个时候,我们的 Rails 服务器只能服务单线程,同样,每次也只能处理一个请求。每个 Rails 主机都运行了一定数量的 Unicom 进程,用以提供主机级的并发性,但是重叠率浪费了太多的资源。归结起来,Rails 服务器每台主机每秒只能处理 200 到 300 个请求。

    然而 Twitter 使用率的增长却并未放缓,这样一来我们就必须投入海量的主机才能匹配用户的增长曲线。

    在那段时间,Twitter 已经拥有部属超大规模基于 JVM 服务的经验——Twitter 的搜索引擎就是使用 Java 编写,而 Streaming API 基础设施以及社交图系统 Flock 都是使用 Scala 编写,同时我们也迷恋 JVM 带来的性能,如果选用 Ruby VM 的话,那么性能、灵活性以及效率都很难符合我们的目标,所以我们开始编写可以运行在 JVM 上的代码。我们预计重写代码库可以让我们获得 10 倍的性能提升,而今天我们每台服务器每秒已经可以处理 1 到 2 万的请求。

    对 JVM 的信任还基于公司中有很多工程师有着丰富的 JVM 经验,我们有信心将 Twitter 带入 JVM 后可以得到本质上的提升。这样下面需要做的就是拆分架构,并弄清楚不同服务之间的交互方式。

    程序设计模型

    在 Twitter 的 Ruby 系统中,并发控制被放在进程级——单网络请求通过进程排队。这个进程会一直占用资源,直到请求结束。这样将同时增加复杂性及架构难度,Twitter 需要完成基于服务的转变。同时因为 Ruby 进程使用单线程模式,后端系统延时将直接影响到响应时间。在 Ruby 中有很多选择来增加并发性,然而 JVM 中却并没有一个标准选择。JVM 拥有着支持并发的设计和基元,让我们可以建立一个真正的并发程序设计平台。

    这样,就需要一个独立且统一的方式去思考并发性,特别是网络的思考。众所周知,编写并发代码(以及并发的网络代码)是非常困难的,并且需要使用多种方式。事实上,这方面我们早就有所体会。然而在系统被分解成不同服务的初期,团队并未使用统一的途径;比如从客户端到服务的 failure semantics 就不能很好交互:我们并没有一致的 back-pressure 机制让服务器给客户端返回信号,因此出现了客户端疯狂重试服务引起的惊群效应。这个经历让我们明白统一、互补的客户端及服务器库的重要性,它可以在多个方面起到作用:连接池、故障转移策略以及负载平衡,将我们连成一体,我们把 Futures 和 Finagle 拉到了一起。

    现在不仅有了统一的方式,同样合并了系统所需核心库;如此我们就可以取得更快的进展,而不用过多关注每个系统的操作方式,从而把精力放到应用程序和服务接口上。

    独立系统

    Twitter 的最大改变就是从一个整体的 Ruby 应用程序转变为基于服务的架构,我们首先聚焦建立 tweet、timeline 及用户服务——这也是 Twitter 的 “核心名词”。这种转变让我们可以更清晰的抽象出边缘、团队级所有权和独立性。在 Twitter 王国,不仅需要理解整个代码库的专家,还有需要模块以及类级别的所有者。越来越大的代码库让全局理解变得不可能,然而在实际工作中,只有模块和类级别的所有者根本不能解决问题。我们的代码库变得很难被维护,而团队不停的去挖掘历史代码以便清楚某一功能。大规模错误发生时,搞清楚状况就像组织去远海狩猎鲸鱼;到了最后,我们在纠错上花费的时间要远大于新特性的发布,这是任何人都不愿看到的情况。

    我们追求的永远都是允许并行设计的面向服务架构,我们赞同网络 RPC 接口,然后独立的开发系统内部构件,然而这同样意味着每个服务的逻辑都必须在内部实现。如果我们需要对 tweet 相关部分做改变,那么只需要在一个位置做出更改(Tweet 服务),这种变化就可以贯穿整个操作系统。然而在实际操作中,发现并不能完全实现这个目标,比如:一个 Tweet 服务中的改变可能会需要其他服务做出相应的改变。虽然没有做到完全独立,但是大部分的情况下还是可以的。 [attach] 2170[/attach]

    这个系统架构就是我们一直期待的,每个团队都可以独立和快速的运转。这就意味着团队可以调用后端系统对所属服务进行操作,非常有益大型应用程序运营。

  • 重铸 Twitter 决心

    当 2010 年人们将 Twitter 作为世界杯体验实时分享工具时,每一脚射门、每一次罚球、以及裁判出示的每一张红牌或黄牌产生的 tweet 都会对系统造成不同程度的影响,同时也会造成程序短时间内的不可用。2010 世界杯期间,工程师日以继夜的工作,拼命的改善系统性能。不幸的是,这样的努力瞬间被 Twitter 的快速增长淹没。

    有过这次经历,我们清楚了只有重新架构才能匹配网站的增长,同时让系统变得更加可靠。随后我们就开启了漫漫的重构之路,而当下 Twitter 已经可以从容应对类似《天空之城》重播、超级碗以及全球新年夜庆典这样的事件,新的架构不仅能弹性的应对负载,还可以帮助工程团队快速发布新特性,包括了跨设备的消息同步,Twitter cards 可以让服务变得更加的丰富并拥有更多的内容,同样还带来了囊括用户和故事的搜索体验。为了实现这些,我们甚至改变了工程组织,下面就来一睹服务打造细节:

    三年磨剑铸辉煌

    重新架构

    在 2010 世界杯尘埃落定后,我们审视了整个系统,并发现众多需要从根本上改善的地方:

    1. Twitter 曾运行着世界上最大的 RoR 堆栈,并将这个技术推到了一个绝对高度:那个时候,大约 200 个工程师在为之奋斗,它确实让 Twitter 渡过了一个用户爆发性时期,不管是新用户的增加,还是负载增加的处理。这个系统一度支撑了所有运作,从管理数据库、memcache 连接到网站的渲染及公共 API 的呈现,这些全部包含在一个代码库里。它不仅让工程师的整合变的困难,同样也困扰了工程团队的管理及并行作业。

    2. 存储系统的吞吐量达到了极限——之前 Twitter 使用的是纯粹的 MySQL 存储系统,进行分片,同时系统只有一个主节点。然而从系统展示的速度上来看,tweet 的吞吐率确实出现了问题。这样我们就必须重建一个新的数据库以应对增长率,因为热门数据的读取已越来越频繁。

    3. 取代从工程方面彻底的解决问题,我们曾尝试过投入更多主机;然而随后就发现,前端 Rbuy 主机并不能处理预期(根据性能)的事务量——从以往的经验看,这些主机完全可以胜任更多的事务。

    4. 最后,从软件角度上看,我们发现我们一直在钻优化这个牛角尖,我们开始在性能和效率与代码库的可读性和灵活性之间做权衡。

    综上所述,系统的重新架构已迫在眉睫,我们给自己定下了 3 个目标和挑战:

    1. 我们希望打造出兼具性能、效率及灵活性的大型基础设施——我们希望能改善 Twitter 上的平均延时,同样我们希望通过离群值给 Twitter 带来统一的体验。我们希望将赖以运行的服务器降到十分之一。我们希望对故障进行隔离以避免大规模宕机——随着服务器规模的日益增大,这点就尤为重要,因为集群的变大意味着主机故障将愈来愈频繁。故障是不可避免的,所以我们希望它们发生在一个更容易控制的模式下。

    2. 我们希望通过将相关的代码放到一起,以获得更清晰的边缘——我们已经感受了整片代码所带来的困扰,所以我们打造一个松耦合、基于服务的架构。我们目标是封装和模块化的最佳实践,当然是在系统级,而不是类、模块或者是包一级。

    3. 最重要的是,我们希望能更快的发布特性。我们希望团队能并行的运作,每一个小组都可以在不依赖其它小组的情况下独立的完成局部决策,并将特性发布给用户。

    我们 POC 了新的架构,虽然不是所有的努力最终都能符合上述目标,但是最起码做到了一部分并且解决了工具问题,当然,还得到了比现下更令人满意及可靠的基础设施。

  • 锤子科技 配置工程师 (CM) at 2013年08月16日

    没看错,就是传说中的那个锤子公司

    [attach] 2168[/attach]

  • Jenkins 带参数输入的 job at 2013年08月16日

    可以调用脚本的

  • 重新 “组装” 雅虎

    梅耶尔竟然被推到了镜头前,这是雅虎今年第二季度财报的电视发布会,而此前从没有一家互联网公司的 CEO 如此高调过。

    从她嘴里出来的数字却不乐观。虽然盈利大涨了 46%,但收益才是一家公司最真实的度量,7% 的降幅表明了广告商们还没有对她包括一连串收购在内的的复活公司的尝试产生兴趣。尤其是展示广告的萎靡,在下滑了 12% 之后,雅虎的市场份额已经跌至 3.1%,远远低于谷歌的 33%,而这被认为是未来的雅虎赖以生存的商业模式。

    梅耶尔并没有透露雅虎何时才能摆脱困境,这难免让那些挑剔的投资者们有些失望,即便在这一年里,他们在雅虎上的投资完全可以有近一倍的浮盈。雅虎的股票涨了 75%,她的确不需要去承担那么大的压力,而是可以去押注一些需要时间来实现的大胆的产品。

    但梅耶尔看上去还是撞上了 “新秀墙”,或者说她搜集的那些 “零件” 并没有让雅虎产生显而易见的变化,而她一贯的高调却已经吊足了公众的胃口,这个落差该如何去填补?

    应该说雅虎的商业模式在很长一段时间内已经定型了,梅耶尔也无法改变。它在体育、财经新闻等垂直领域做得太受欢迎,以至于这些业务几乎不可能被砍掉,但它们却又不足以好到引领整个公司的转型。这是媒体属性公司的共通问题,它牵扯到一个生态体系,它的蜕变总是很艰难,不像谷歌这样的以产品为导向的公司。

    所以你会发现,她所做的一切与一些只顾削减资产和快速修补的复苏计划恰恰相反,她正尝试着首先解决雅虎的核心文化问题,其次才是修复它的产品和商业化问题。当雅虎重新出现在硅谷那些精英们的视线中时,梅耶尔其实已经赢得了一个好的开始。

    失控

    从这个层面讲,前雅虎 CEO 巴茨——那个把雅虎推向悬崖边的女人也并非一无是处。她也强调内容的个性化,为此不惜在几个优势领域不断投入;她要求公司上下把移动业务看成是水平的,也就是说如果想要开拓新业务的话,就必须先思考它是否能被放到移动设备上;巴茨十分在意雅虎的整体和简单,她不断地在做减法,还要求各个部门打破之间的藩篱……

    她甚至看上去比梅耶尔更有魄力,在放弃搜索业务上,她简直执拗得不可思议,即便 “巴拿马计划(雅虎的搜索引擎产品)” 已经筹备了 5 年,而媒体也已经开始大面积地质疑刚刚上任的她在 “自断双臂”。

    巴茨要做 “世界上最好的数字媒体公司”,她的路径就是让雅虎摆脱新闻 “聚合器” 的角色,而真正成为用户的 “起始点”。“起始点并不只关乎雅虎的原创或授权内容,我们还需要提供对其他内容的访问,比如用户生成内容和外链。过去,引导用户访问第三方网站曾引起很多人的担忧,但我们相信,如果打造出合适的内容和产品体验,人们最终还是会回来的。” 时任雅虎媒体副总裁的皮塔罗称。

    这时候的雅虎正试图把原创内容的比例从 10% 提升到 20%,而巴茨也计划引入 50 个有趣的站点,“它们全与娱乐、生活品味、女性、运动男性、电影、娱乐新闻有关,都是你们想要的。”

    这样的雅虎其实也不错,个性化的内容会让它永远知道用户的兴趣点,这意味着源源不断的流量,而变现能力更好的展示广告也同时能满足客户对多媒体的需求。而且即便是移动互联网时代到来,雅虎也早在手机上有所布局。

    但问题就出在巴茨想要跨越过的那个社交时代,一个令人绝望的现实是一年之后,Facebook 反而超越了雅虎,成为展示广告的领头羊。雅虎的收入并没有出现大的滑坡,打败它的是竞争对手那一条近乎变态的增长曲线。

    后来的故事耳熟能详,雅虎逐渐被割裂成了邮箱、体育新闻等几个产品,它再也称不上是一个媒体平台了。雅虎开始变得迟钝和狂躁,对于涌现出来的新的商业模式,它力不从心(包括与阿里巴巴的闹翻),而内部的协调和沟通也越来越不顺畅,雅虎彻底失控了。

    巴茨最后得到的几乎是一边倒的骂声,辞职那天,雅虎的股价甚至逆市上涨了 6%,可见这家公司已经荒唐到什么地步。此后的两任 CEO 都无力改变什么,在他们短暂的任期内,雅虎依然没有任何好转。

    究竟谁能拯救雅虎?Techcrunch 创始人阿灵顿的答案是:“雅虎需要一名新 CEO,他首先不是想着裁员,而是怎么让现有的几万人来创造和奉献;他不是看重那笔高昂的 ‘分手费’,而是重视产品甚于重视商业模式。这个 CEO 应该让雅虎的员工们在大街上抬起头来昂首挺胸。”

    新秀墙

    梅耶尔的出现其实并没有让媒体重拾对雅虎的信心,原因是她上任两个月之后公布的那个平淡无奇的 “战略与愿景” 远不如她金黄色的头发有话题性。

    但雅虎内部却在发生着一些微妙的变化。在雅虎全球副总裁、雅虎北京全球研发中心总裁张晨看来,梅耶尔做得一件 “了不起的事情” 就是建立了一个内部交流平台,“任何一个员工提出的问题,只要超过 50 个人赞同,梅耶尔就会亲自过问。”

    她会要求被讨论的问题要在一个星期之内解决,而在每周五举行的名为 “FYI” 的全体员工会上(包括在线和视频等方式),“如果我负责的项目被员工提出来了,压力就会非常大,这也使得很多没有效率的地方都暴露出来了。” 张晨说。

    而在之前,据被雅虎收购的图片分享网站 Flickr 的员工爆料,团队花在产品开发上的时间大概只有 15%,剩余 85% 是在和总部来回扯皮。在他自己的工作日志里,曾经 9 个月中的 18 个会议都是在讨论接口的设计有多烂,但谁都没提出一个解决方法。

    梅耶尔的产品出身深得工程师们的青睐,“他们重新找到了在一个组织里的荣誉感和参与感。” 张晨说。巴茨也曾在上任的前两个月里与高管及工程师逐一单独会面,力图将这个内部机构纷繁庞杂的公司捏合成一个整体,但仅仅只有这一次。

    智拓通达是梅耶尔送给张晨的 “礼物”,这也是她的第 18 笔收购。雅虎北京全球研发中心的主要课题就是个性化,这是梅耶尔认为的可以重新定义雅虎的产品方向。而智拓通达的业务主要集中在社交平台的大数据分析和挖掘,通过整合社交平台上的用户数据、行为数据和 UGC 内容,为用户提供定制化的服务。

    同之前绝大多数的收购相同,智拓通达的原有业务将关闭,所有交易的重点就是它的创始人郑皓,他曾是雅虎北京全球研发中心的首席架构师。

    据张晨透露,雅虎公布的收购维度有三个,“第一种是为现有产品组合带来互补性技术或媒介平台的公司;第二类是扩展业务能够覆盖的区域;而第三类就是为我们带来顶级的人才。” 但很显然,雅虎的收购几乎都指向了第三点,去年收购的 Summly 还没有任何收入,而它的创始人只有 16 岁。

    从去年第一笔收购开始,梅耶尔就成了硅谷最热的话题,像 Tumblr(全球最大的轻博客网站)、Hulu 这类的热门收购对象开始考虑雅虎,这在之前是绝对不可能的事情。但有趣的是,对于他们来讲,“加入梅耶尔” 要远远比 “加入雅虎” 更有诱惑力。

    雅虎正在赢得声誉,但梅耶尔还飘在空中,她所说的 “个性化” 也只是在新改版的雅虎主页上初见端倪。新的雅虎采用三栏式设计,新闻以瀑布流的形式置于中间。右栏依次为天气、Facebook、Flickr 以及最新的视频,而左栏则是清晰明了的导航栏。

    最大的变化就是用户可以随时 “删掉” 主页上的新闻,而雅虎会根据标签记录你的阅读喜好,从而实现所谓的个性化内容推荐。这还仅仅是开始,张晨的团队正在开发的是个性化平台,理想状况下,所有的雅虎产品都能利用这个平台去完成个性化的设置。

    其实这些都不是问题,当雅虎开始真正像一个组织那样去运转时,它依然会对市场造成足够的冲击。过去的一个季度,雅虎每天都有新产品上线,而曾经失去的流量也在一点点回来。当张晨他们第一次看到梅耶尔展示的那一条流量曲线时,个个都兴奋不已。

    但谁又能保证这份热情能持续多久,最新的一季财报已显示出了雅虎皮囊的变化大于本质。梅耶尔需要一个能传达积极信号的财报,所以,如何快速地把这些 “零件” 组装起来迫在眉睫,毕竟资本市场的耐心是有限的。

  • 能否介绍下阿里云目前配置管理团队的情况?

    这样大家也好斟酌

  • TFS 热门提示,TFS 最佳实践 at 2013年08月15日

    [i=s] 本帖最后由 scmroad 于 2013-8-16 17:21 编辑

    [b] TFS 命令行基本操作 [/b]

    TFS rollback changesets (TFS 回滚变更集)[url]http://bbs.scmroad.com/thread-24458-1-1.html/url][ tf rollback /changeset:60 C:\d\Test\release\1.1* /r

    TFS discard merge(TFS 合并时丢弃变更)[url]http://bbs.scmroad.com/thread-26335-1-1.html/url][ tf merge /discard /recursive /version:C653320 $/tfs/project/release/ $/tfs/project/main/

    TFS unlock 和 undo 文件 [url]http://bbs.scmroad.com/thread-23764-1-1.html/url][ tf lock $/proj/test /lock:none /workspace workspaceName;DOMAIN\username /s:http://tfs:8080 /r tf undo /workspace:WKSP11_621_103;scmroad\scm/r /login:tfsadmin,pwd $/main/projectA/lib/AnyCpu/release/*

  • 王坚:阿里巴巴为什么 “去 IOE”(四)

    在阿里集团首席技术官和阿里云总裁角色之间转变,王坚面临很大挑战,他必须为阿里寻找并发展关键的核心技术,从发展自有云计算技术到 “云 OS” 系统开发,每一个选择都意味深长,但任何一场风波也可能使他置身谷底,在遭遇市场 “抨击” 后,王坚总能以更快的速度为阿里夯实技术基础同时积累新的技术经验。

    王坚说,他大部分的工作是集团首席技术官,但他始终认为:“我是非常幸运的,没有阿里云,阿里的技术是少了一个重要的成长环境。如果 “飞天” 这样的平台没有投入市场,不与客户碰撞,单纯的研发部门无法生长出真正的好技术。同样,没有阿里其它业务,很多云计算业务也起不来,比如 CDN 业务”

    阿里云计算平台与国内其他云计算平台的本质区别在于通用性。王坚说:“今天国内的云计算平台,有的和企业自身业务结合的比较紧,有的仅是一个垂直平台,而阿里云是一个通用整合平台,我们开放的是计算能力,驾驭和把握这一平台需要很大实力。

    Q:您怎样定义云计算?

    A:云计算是一种公共服务,当计算变成一种服务能力时,对于企业而言买 “计算机” 的时代变成了买 “计算” 服务的时代。为什么计算会变成公共服务?可以从两个角度看:从用户角度看,今天你只要拥抱互联网你就要用云计算,如果你觉得互联网跟你没关系你可以不用;同时你又不想买服务器,因为只有服务器没有用,它需要整个互联网基础设施支持才能发挥作用,云计算就适合你。这是真正的变革,因为云计算的计算能力变成一种公共服务的时候,已超过了以往任何的计算技术对社会产生的影响。这就是云计算真正给社会带来的价值。

    IT 的这种变局背后的真正推手是互联网。这就是为什么我说 “用云计算” 的本质是 “用互联网”,企业的 IT 和业务都离不开互联网,互联网的特质和冲击使传统企业 IT 无法应对。如果你的企业永远跟互联网没有关系,十年之后,很难想象企业会是什么样子。云计算作为一种公共服务,它的前提是互联网无处不在,今天,手机上网甚至比找一个电源插座更容易,这就是革命。

    从这个角度讲,阿里云计算平台帮助各种类型的企业做了一次互联网的转型,这些企业又带动他的客户做了一次转型,云计算可以把一家传统公司变成一家互联网公司。你想这件事情,不只是给 IT 节省了一点成本,实际上做的是向互联网转型的事情,你在云计算上面就可以重新思考你的一些业务问题,重新思考你的很多事情该怎么做了。

    4 年前,我们就在说数据分享平台,其实是这样的道理:没有云计算,今天大数据的概念是不存在的,云计算是今天所有讲数据的基础,云计算给客户真正的价值是跟数据有关系,而不只是给客户省成本。我要跟 CIO 讲的事情是说,今天你搬到云计算平台上是为了让节省成本,未来让你尝到的甜头是你的数据通过云计算产生更大的价值。

    Q:公共服务相对来说是标准化的,计算跟电力还是不太一样的,电力基本上是标准化的服务,大家对计算的需求是千奇百怪的,包括一个企业从简单的单纯的计算能力到存储,到后来业务系统的 ERP,这些矛盾未来怎么解决呢?

    A:大家对云计算理解不同,大部分人所说的云计算,是基于互联网后台的垂直系统,并不是阿里云做的云计算。阿里云做的云计算类似于提供一台大的计算机,上面有存储能力、计算能力和操作系统、数据库系统,用户可以在计算机上做原来 IT 的事情,云计算并没有把传统 IT 所要承担的使命消灭掉,而是将原有 IT 基础设施转移到了新的平台上,跟上互联网的发展,专注于企业自身密切相关的技术,更好地和开源社区分享。

    我们真正要革命的是什么呢?是要革掉把计算机搬回家里的旧局;是要企业主动拥抱互联网,重视起做服务;是要企业知道现在是在通过互联网跟全世界人打交道,而不仅仅是自己的公司业务人员和销售;更是要打破原有企业 IT 架构的所有基础设施。

    Q:您能描述一下阿里云的几类客户的类型?阿里云与其客户的合作方式是怎样的?

    A:阿里云的客户涉及消费电子、公共卫生、能源管理、媒体、电子商务、电子政务、移动互联网等众多行业,服务着我们今天无法精确统计的无数用户,你今天(不是未来)用手机、看电视、玩手游、上一个网站甚至买一盒药,都有可能用了阿里云的服务。阿里云的客户类型可以从不同维度描述。第一个维度是 “大小”,可以是一个人的公司,也可以是像联想这样的大型集团企业;第二从行业维度,有传统的互联网公司,也有移动互联网公司,比如手游公司,还有一些传统企业,比如杭州九阳股份有限公司,这类传统企业的 IT 不是一次搬上来的,是一点点移上来的,这有个过程的。从合作的角度考虑,有我们的直接客户,因为阿里云没有销售,我们为这些企业开设账号后,他们有能力自己到阿里云的平台上;还通过商派这样的合作伙伴到云上来的,他们帮助更多的企业来到阿里云的平台。

    我自己觉得中国的云计算会比美国发展的更快。美国的 IT 行业很成熟,传统 IT 的服务也比较好,云计算给企业带来的直接价值远远没有在中国大,比如运营商之间互联互通这个问题在美国是没有的,而中国有,因此中国企业到云计算的速度有可能会比美国快得多。中国企业也会因为整个 IT 大环境的原因,对云计算需求会更大。今天有一些企业来到阿里云平台,连我都觉得确实不可思议,原来我以为要等更长时间。

    云计算可以帮助把一家传统公司变成一家互联网公司,这件事情不仅节省了 IT 成本,更重要的是在云计算平台上,企业可以重新思考自己的业务问题。我非常佩服很多企业能够信任我们,把她的东西放在我们上面,中国的企业如果不能背靠背,是没有希望的。今天敢于拥抱云计算的企业是值得敬仰的。云计算带给企业的创新能力和发展空间是不可想象的,这件事情是真的是革命!

    Q:云计算的建设很复杂,一是说技术难度很大,二是说运营的挑战更大,您又是如何管理好这样一家云计算的公司的呢?

    A:我认为发展好一家云计算公司,技术和运营是最关键的两点:首先,我们必须要承认云计算是有技术门槛的,今天,很多人说云计算是一种服务,只是觉得这是模式的改变,而没有意识到的技术也是一个门槛。“云计算” 这样的软件既没有人卖给你,也没有这样的软件。其次,云计算真正的竞争力是运营,这也是当别人问我为什么不把 “飞天” 系统卖给别人时,我说不是我不愿意卖,这个时代已经不是软件时代了,云计算这样的产品只有代码,并不是软件,也不是刻张光盘就可以卖给你,这是需要运营的,你不运营这件事情是做不好的。

    同样技术和运营也是一体的。两三年前,阿里巴巴很多公司后台的运营是独立的,前年我们做了一件事情,就是将所有的技术后台运维和运营部门都集中在首席技术官下面的一个部门 - 集团技术保障部,现在整个阿里集团的后台运维和运营是由这一个团队完成的,这是阿里巴巴很强的软竞争力。原来在不同子公司和事业部的人,从工具到理念都需要融合,结果表明这样对适应集团业务的快速发展和变化是很成功的,并且能够用这样的方法驾驭大型互联网企业对技术服务的挑战。这一过程中,我们经历的技术和组织挑战和付出的学费可以为其他企业的借鉴。从这个角度讲,一家传统企业到阿里云上面来,我们一定能比较好得解决他的问题,因为我们本身经历过这个过程。

    北京玩蟹科技有限公司 CEO 叶凯曾在微博上列举了几次阿里云断电、存储出现的问题,玩蟹科技从阿里云迁出这件事闹的沸沸扬扬,但经过这样的事情,我们和叶凯成为了非常好的朋友,玩蟹事件的根本不是我们的技术问题,而是我们不会做服务。

    现在除了玩蟹的几个老游戏,其余都已经在阿里云上了,他八月发布的最新游戏也是部署在阿里云上。玩蟹这件事让阿里云更快地学会怎么做云计算服务。在我眼里移动互联网和互联网是不分的,但做移动互联网的人更容易意识到云计算的价值,像玩蟹 3 个创始人,包括叶凯,他们天生相信云计算,认为只有云计算能够支撑公司的发展速度。怎样通过服务让用户对你的云计算平台产生信任?叶凯对我说:“我知道会出事故,更知道哪里会出事故,重要的是你的服务要好,出了事故可以在第一时间响应。我知道其实即便我自己维护也会出事故的。” 真心敬仰这样的创业者,是他们奠定了云计算的基础。

    用户的容忍度超出我的想象,我被叶凯说得很感动的。通过交流,我们也能因此更好地服务好玩蟹,以前客户购买新的服务器,需要在阿里云网站手工下单,现在玩蟹可以根据游戏行业的特点,通过 API 的形式实现他们的服务自动弹性可扩展,这样用户不用提前几个小时准备,真正意义上实现了云计算的弹性服务,这样给企业带来的价值已经远远超出了成本的节约。这就是我一直强调的 “从客户那里学云计算”,就是学会如何做云计算的服务!

    Q:您有没有总结过客户对阿里云最多的抱怨是什么?您认为阿里云做云计算最大的挑战在哪里?

    A:今天客户对我们最大的抱怨是服务,我们对服务的思考影响我们对产品的定义,也会影响我们对技术的优先权考虑。哪怕不到位是一个客服的电话,比如,一定要保证一个客户的电话永远有同一个人接听;再比如,响应时间能不能不超过 15 分钟,否则会导致一个游戏公司可能会永远失去它的用户,当然这些东西我们以前学不到的。停一个小时服务,会让一家公司死掉这种事情,讲起来很容易理解,但是要让阿里云的每一个员工有体验是很难的,难度大大超过我的想象。我今天就是要保证员工能够体验到这种感受,而不是知道这个道理。在地面上很容易理解飞机发动机出故障的危险,但它和你自己坐在飞机上的体验是完全不一样的。

    我希望有一天我们这个平台不只是我们自己骄傲,也是中国所有创业者和开发者的骄傲,当然我觉得持续保证我们技术上的竞争力也是很挑战的。因为站在我的角度,飞天平台是做了一个数据中心的操作系统,在中国,没有人真正意义上去做过这样一个技术的平台,并把它变成一个商业,这个是巨大的挑战。飞天开放平台一直是阿里云的研发重点,阿里云的云计算就是飞天。同样我们做飞天的挑战在于:一是国内没有人有经验做这样的事情,国内从来没有过这样一个商业化计算平台;二是真正的把云计算做成一种服务,是要想清楚的,如果不用新的服务模式,业务量的扩大也意味着人员的增加,是没有能力把业务扩大 10 倍上百倍的,而我的目标非常简单,不能增加人,要用互联网的方式为大家提供服务,我们坚持阿里云不设销售人员,单从这个角度讲,我们怎么把云计算服务做好是有非常大的挑战。

    今天唯一不挑战的就是市场,这个需求是刚性需求。如果我们云计算做不起来只有一个结论,就是我们这帮人无能。我们运气的地方是我们犯了一些错误,但是至今还没有死在错误上。我们拿到了一个历史的机会,这是千载难逢的机会,你不可能等到下一次这样的时代到来,而这个时代就是需要的东西,碰巧我们在做这个事情。

    Q:您怎样看待 “云 OS” 引发的业界讨论?

    A:云计算直接推动了移动操作系统的发展。云计算让整个移动信息产业从以终端作为信息的交换中心,变成了以云作为信息的交换中心。在移动互联网时代,任何一个没有云的终端都谈不上是智能终端。移动互联网的数据入口和信息安全是阿里巴巴这样一家公司不可以回避的挑战,也是阿里发展阿里云 OS 的基础。,“云 OS” 的目标是在 2014 年 4 月达到 3000 万终端使用云 OS 移动操作系统。

    目前大概有几十个手机厂家跟我们合作,用我们这个操作系统的机顶盒也已经出来了,但我想强调我们自己不做手机,我们自己也不做机顶盒,我们在做一个好的互联网时代的操作系统。

    云 OS 的各种争议反映了大家对互联网时代操作系统认识的不一样以及对技术发展的判断不一样,对这样一个困难的问题也很自然。但这些争议的核心点是大家对手机操作系统的定位是不一样的,就像在没有 Machitosh 以前,大家不会觉得 GUI(图形用户界面) 是操作系统的一部分,在 Windows 95 以前,浏览器不是操作系统的一部分,在互联网时代,如何让服务体系和在线体验变成操作系统的一部分是一个巨大的挑战,有争议也不奇怪。我们的定位非常简单,在中国的互联网公司,如果没有一家公司拥有移动互联网的操作系统是不现实的,或者说我们在移动互联网时代会被大大落后的。

  • 王坚:阿里巴巴为什么 “去 IOE”(三)

    阿里巴巴如何 “去 IOE” 2013年5月17日,阿里集团最后一台 IBM 小机在支付宝下线。这是自 2009 年 “去 IOE” 战略透露以来,“去 IOE” 非常重要的一个节点。“去 IOE” 指的是摆脱掉 IT 部署中原有的 IBM 小型机、Oracle 数据库以及 EMC 存储的过度依赖。告别最后一台小机,意味着整个阿里集团尽管还有一些 Oracle 数据库和 EMC 存储,但是 IBM 小型机已全部消失。7 月 10 日,淘宝重中之重的广告系统使用的 Oracle 数据库下线,也是整个淘宝最后一个 Oracle 数据库。这两件事合在一起是阿里巴巴技术发展过程中的一个重要里程碑。

    在阿里巴巴 “去 IOE” 成功的大背景下,王坚的观点是:“去 IOE” 存在一定的技术挑战,“去 IOE” 不是简单改变软件和硬件本身,用另一种软硬件简单地取代已有的软硬件,而是用新的互联网技术和架构取代传统的 IT 技术和架构。阿里巴巴本身并不卖软件和硬件,但这种技术能力可以用云服务的方式来提供给第三方使用,让云计算彻底改变传统 IT 的基础架构。对大多数企业而言 “去 IOE 最好的解决方式是采用云计算,而不是买来一台新的机器替代掉原有机器。”

    作为整个集团的首席技术官,王坚负责每年集团 IT 预算和规划,他意识到对于传统 IT 厂商的依赖使得相关技术及其维护已不在阿里自己可管理的范围之内,例如,大存储对客户而言基本就是 “黑盒子”,客户都不能自行进行重要的维护,主要依赖厂家通过 WAN 网络或电话拔号连接上客户内部的大存储进行管理维护。“去 IOE” 也解决了淘宝和支付宝面临的这类影响长远发展的问题。

    为什么阿里能够率先成功?我认为有三点重要原因:一是企业的战略决心是否足够强大,在这一点上没有巧可以取;二是这项工作是否能够坚持到底,并愿意承担技术上、组织上的各种风险;三是,也是最重要的,要有使命感的人和团队去完成一件看起来不可能的事。从去 “IOE”,也看得出阿里巴巴在技术上做出的战略投入,当然也包括飞天云计算平台、数据库、云 OS 操作系统等

    Q:阿里巴巴为什么要做 “去 IOE” 这件事?“去 IOE” 经历了怎样的过程?

    A:2008~2009 年,在做整个集团的预算时,第一次提出了 “去 IOE” 这件事。每年,我都要负责整个集团技术预算拟定,当看到阿里巴巴对计算需求成指数级增长,并跟业务增长不成比例时,就意识到如没有技术的进步,一定会影响公司长远的发展。

    做预算不仅仅是 “钱” 的问题,而是考虑集团未来如何发展的问题,也是思考技术战略的机会。“去 IOE” 不是一个人的决定,你需要分析企业业务情况,哪些业务适合尝试 “去 IOE”,阿里比较幸运,当时淘宝的技术团队愿意创新,去尝试 “去 IOE” 这件事,最早承担这件事的技术和业务风险。“去 IOE” 的过程也是技术发展的过程,比如以淘宝为基础形成了优秀的 Mysql 数据库团队,也建立了自己开发数据库 Oceanbase 的团队,现在的团队来自各事业部,双管齐下,这是一个极大的长期投入,不磨五年是磨不出来的。当支付宝最后一台 IBM 小机下线时,整个技术团队是非常自豪的!

    当时我们考虑 “去 IOE” 并不仅仅出于对成本的考量,成本只是最容易看得到的东西,最重要的是要满足企业未来长期发展的需要。互联网时代,每一家企业都必须拥抱互联网,传统 IT 架构的软硬件已经无法满足企业在这方面的发展。阿里巴巴的成功经验表明原来依赖 IBM、Oracle 和 EMC 的系统是可以构建在 Commodity PC 上的,这为大多数企业在云计算上搭建 IT 系统扫清了障碍,让他们可以彻底拥抱云计算,拥抱互联网。

    Q:传统企业 “去 IOE” 的可能性有多大?哪些企业具备 “去 IOE” 的条件和动力?

    A:如果对云计算带来的冲击认识足够,就会明白 “去 IOE” 不是一次技术的升级,而是一个时代的改变,云计算对传统的 IT 和 “开源软件” 都是有冲击的。这是行业的变化,不是一个技术策略的选择。

    正是因为这是一次 IT 基础设施的变革,从硬件和软件底层着手 “去 IOE” 这件事情不该每个企业都做。如果要说一个很直截了当的答案,我会表明一个观点:如果企业觉得已有的云计算服务不能满足 IT 需求,那么它适合自己完成 “去 IOE”,我认为大部分传统企业都是没有可能和必要自己实现 “去 IOE”,其实,要做 “去 IOE” 这件事情,是有技术挑战的,也受市场条件的约束,有机会成本问题,当然也有总体人才资源的限制。所以最好帮助大多数传统企业用户解决 “去 IOE” 的途径是云计算,云计算提供的计算服务可以将 “IOE” 去掉,对企业来讲这是一个好的可以长期发展的路径。

    对传统企业来讲,“去 IOE” 的根本是在做一个选择,是在选择是否信任云计算是一种公共服务,就像企业信任国家电网供电一样。当你选择了 IBM 的机器,实际上是觉得 IBM 的机器和这家企业是可以信任的。

    大家经常忽视一个奇怪的现象,一方面我们都承认云计算是一种服务,但是更多的厂商会和你谈 “私有云”,想把软件和硬件卖给你,这时候 “云计算是服务” 就不见了。为了成功卖出软件硬件,唯一可以说的事情就是安全问题,这是我看 “私有云 “的两大问题。“IOE” 本身是软件时代或者说买计算机时代留下的产物,而到了云计算时代,实际上变成一个买 “计算” 的时代,不是买 “计算机” 的时代,所以去 IOE 的方法应该用服务的方式去掉。“去 IOE” 不是用一个技术替代一个技术,而是一个新的时代到来了。这个过程中的挑战是,你心理是否接受云计算,而不只是技术上是否接受。

    企业自己去 IOE 意味着要重复阿里今天做的很多事情,这是一个长期投入,而阿里云可以给企业 “去 IOE” 帮助的是直接提供云计算服务,我们已经帮助一些小银行做了;阿里也愿意将自己 “去 IOE” 的经验分享,这也是全社会的财富,但没有办法把 “去 IOE” 的积累变成软件硬件卖给企业,我们不是传统的 IT 设备和软件提供商。

    Q:您怎样看待 “去 IOE” 的人才培养过程?

    A:我自己觉得,大多数人对阿里巴巴集团技术人员的技术能力还不太了解,阿里巴巴的技术积累一定超出很多人的想象。我用另外一句话来说,“去 IOE” 这件事情,没做成,肯定是我的责任;今天做成了,跟我一点关系都没有。我们真的有很多很好的人才,比如说像淘宝的一位员工,他对淘宝业务的熟悉,对技术的理解也不是一般人可以比的,更重要的是他愿意 “革自己的命”,绝不担心 “去 IOE“会让自己原来的技能没有用,这时候理想变得比什么都重要。

    大多数严重依赖 IOE 的企业在技术人才培养有点 “拿自己的钱给别人交学费,但却给自己带了手铐”,中国企业对技术的需求旺盛,超过世界上任何国家和地区,所以技术上面临的挑战也超过了他们,但我们主要使用的是国外传统 IT 企业的软硬件,而别人也没有现成的技术能解决你的问题,我们自己也因为这种依赖而失去很多机会。阿里巴巴曾经选用过 Greenplum 是一个很好的例子,付了很多学费。。“去 IOE” 的经验表明,现在我们有一次机会把我们的需求和钱用来发展适合长远发展的技术,让 IT 围绕自己的产品来发展。

    对于我们自己的人才选择,阿里很谨慎,很多在国外厂商干过的顶级人才,并没有轻松地收到聘书,这是因为在企业中跟着别人做事,和在阿里用使命感开闯出一片天空有很大不同。“去 IOE” 需要极其合适的人才,才能带出一支像样的队伍,团队里每一个人的潜力也是逐渐被激发出来的。

  • 王坚:阿里巴巴为什么 “去 IOE”(二)

    2012 年的 “双十一”,阿里巴巴创造了 191 亿的日交易额神话。阿里云计算平台处理了淘宝和天猫 20% 商家的订单,并且实现了流量巨增零故障、零订单遗漏。在云平台上,更有日订单数近 60 万的天猫商家,其交易量已经达到当时中国除淘宝以外其他 B2C 市场一天的订单量。

    在 “双十一” 活动前,一些商家并不完全相信阿里云平台,他们仍然部署在自有的 IT 基础设施上,当活动中交易量暴涨,突然出现服务器能力不够时,阿里立即协助商家在十几分钟内迅速迁移至阿里云计算平台,保证其交易顺利继续,有几家企业就是这样在半夜 12 点的时间段完成迁移的。

    本文是《商业价值》出版人刘湘明在杭州阿里云总部与阿里巴巴首席技术官、阿里云总裁王坚对话的第二篇——

    阿里巴巴双十一的秘密 Q:淘宝顺利挺过 “双十一” 的大流量和交易,有哪些关键的问题必须解决?

    A:淘宝双十一关键要解决三个问题:支付问题,淘宝自身的问题和淘宝客户的问题。

    支付的问题难点在银行,淘宝和天猫的总交易额有 191 亿,交易笔数是 1 亿零 280 万笔,对于淘宝来说,一共有多少笔结算是非常重要的,因为在银行承担不了的前提下,需要尽可能在支付宝完成交易,支付宝的技术能力决定了系统的承载能力。

    以前,交易量过大时银行支持会出现问题,支付宝就会对交易进行排队,延迟交易。但双十一的交易量太大,延迟时间太长会产生很大的用户体验问题,所以支付宝提前做了鼓励用户先充值进支付宝的活动,这笔钱的规模当时达到了几十亿,一定程度上缓解了银行的压力,把对银行系统的压力直接转嫁到了支付宝系统上,使得双十一当天的交易顺利进行。“双十一” 表明了支付宝的支付系统是世界一流的。

    第二,淘宝自身的挑战在于面对突然出现的并发流量和意外情况发生时,如何保持系统的稳定性并完成天文数字的交易量。就像电影院虽然修了安全通道,但有意外观众仍然可能不按紧急通道的提示行动,而伤到人,紧急情况下用户的行为是没有办法预测的。淘宝也是一样,在意外情况下,任然无法预测用户行为,本来没有流量的地方,可能会突然跑出一个吓人的流量,任何一个局部的问题都有可能演变成为一个全局的问题,这个就是困难的地方。“双十一” 当天阿里巴巴集团近千名技术和业务人员坐在一层,用一个指挥体系处理问题,准备了近五百种预案,因为现场出现问题再去解决肯定来不及,一个回车键敲错了,可能那个系统就瘫痪了。“双十一” 也表明了淘宝和天猫的交易系统是世界一流的。

    第三,解决淘宝客户的问题主要是通过阿里自身的技术力量去解决客户面临的问题,比如 “聚石塔” 项目,将天猫和淘宝卖家的全部交易流程都部署在阿里云计算平台上,保证他们交易系统的稳定性,从而保证他们的交易顺利完成。

    过去,交易从淘宝链接到卖家后台系统的过程中,如果卖家 IT 基础设施薄弱,系统交换数据会因为网络等各种原因不通都可能会使交易失败。“双十一” 有一句话是说 “20% 的交易量是在云上完成”,这其实是说有 20% 交易量其卖家的后台系统是部署在阿里云上的。以往买家买一个东西只需要点击购买,然后进行支付,这个动作会指向两条 IT 路径:一是连接支付宝,保证有钱可以完成支付;另一条则是进入卖家的 ERP,卖家需要知道自己是否有库存,并减掉相应的货品数量。把卖家的 ERP 系统完全架设在云上,这件事的难度和意义比只解决网站流量扩容要大,因为从发票打印到发货都要通过这个系统,不同的 ISV(独立软件开发商)也在其中起了关健的作用,让人们体会到一个生态的价值。

    卖家把 ERP 搬到云上,也证明了对云计算的信任,我们今年的目标是让 70%-80% 的交易在云上完成,这不仅仅是为客户节约成本,更是帮助卖家提升赚钱的几率。这件事的本质反映了:云计算是一场改革,给客户创造业务价值的意义,远远超过了成本本身。

  • 都是很不错的公司,可以尝试投个简历过去

  • 这里原作者翻译有误,应该是覆盖原来文件中的内容,只是修改,并未把原来的文件删除然后再创建

    1. 命令: alias

    alias 是一个系统自建的 shell 命令,允许你为名字比较长的或者经常使用的命令指定别名。 我经常用 ‘ls -l‘命令,它有五个字符(包括空格)。于是我为它创建了一个别名 ‘l'。

    root@tecmint:~# alias l='ls -l'

    试试它是否能用:

    root@tecmint:~# l

    total 36 drwxr-xr-x 3 tecmint tecmint 4096 May 10 11:14 Binary drwxr-xr-x 3 tecmint tecmint 4096 May 21 11:21 Desktop drwxr-xr-x 2 tecmint tecmint 4096 May 21 15:23 Documents drwxr-xr-x 8 tecmint tecmint 4096 May 20 14:56 Downloads drwxr-xr-x 2 tecmint tecmint 4096 May 7 16:58 Music drwxr-xr-x 2 tecmint tecmint 4096 May 20 16:17 Pictures drwxr-xr-x 2 tecmint tecmint 4096 May 7 16:58 Public drwxr-xr-x 2 tecmint tecmint 4096 May 7 16:58 Templates drwxr-xr-x 2 tecmint tecmint 4096 May 7 16:58 Videos

    去掉’l'别名,要使用 unalias 命令:

    root@tecmint:~# unalias l

    再试试:

    root@tecmint:~# l bash: l: command not found

    开个玩笑,把一个重要命令的别名指定为另一个重要命令:

    alias cd='ls -l' (set alias of ls -l to cd) alias su='pwd' (set alias of pwd to su) .... (You can create your own) ....

    想想多么有趣,现在如果你的朋友敲入 ‘cd'命令,当他看到的是目录文件列表而不是改变目录;当他试图用’su‘命令时,他会进入当前目录。你可以随后去掉别名,向他解释以上情况。

    29.命令: df

    报告系统的磁盘使用情况。在跟踪磁盘使用情况方面对于普通用户和系统管理员都很有用。 ‘df‘ 通过检查目录大小工作,但这一数值仅当文件关闭时才得到更新。 root@tecmint:~# df

    Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda1 47929224 7811908 37675948 18% / none 4 0 4 0% /sys/fs/cgroup udev 1005916 4 1005912 1% /dev tmpfs 202824 816 202008 1% /run none 5120 0 5120 0% /run/lock none 1014120 628 1013492 1% /run/shm none 102400 44 102356 1% /run/user /dev/sda5 184307 79852 94727 46% /boot /dev/sda7 95989516 61104 91045676 1% /data /dev/sda8 91953192 57032 87218528 1% /personal

    ‘df’ 命令的更多例子请参阅 12 df Command Examples in Linux.

    1. 命令: du

    估计文件的空间占用。 逐层统计文件(例如以递归方式)并输出摘要。

    root@tecmint:~# du

    8 ./Daily Pics/wp-polls/images/default_gradient 8 ./Daily Pics/wp-polls/images/default 32 ./Daily Pics/wp-polls/images 8 ./Daily Pics/wp-polls/tinymce/plugins/polls/langs 8 ./Daily Pics/wp-polls/tinymce/plugins/polls/img 28 ./Daily Pics/wp-polls/tinymce/plugins/polls 32 ./Daily Pics/wp-polls/tinymce/plugins 36 ./Daily Pics/wp-polls/tinymce 580 ./Daily Pics/wp-polls 1456 ./Daily Pics 36 ./Plugins/wordpress-author-box 16180 ./Plugins 12 ./May Articles 2013/Xtreme Download Manager 4632 ./May Articles 2013/XCache

    注意: ‘df‘ 只显示文件系统的使用统计,但 ‘du‘统计目录内容。‘du‘命令的更详细信息请参阅 10 du (Disk Usage) Commands.

    1. 命令: rm

    'rm' 标准移除命令。 rm 可以用来删除文件和目录。 删除目录

    root@tecmint:~# rm PassportApplicationForm_Main_English_V1.0 rm: cannot remove `PassportApplicationForm_Main_English_V1.0': Is a directory 'rm' 不能直接删除目录,需要加上相应的'-rf'参数才可以。

    root@tecmint:~# rm -rf PassportApplicationForm_Main_English_V1.0

    警告: "rm -rf" 命令是一个破坏性的命令,假如你不小心删除一个错误的目录。一旦你使用'rm -rf' 删除一个目录,在目录中所有的文件包括目录本身会被永久的删除,所以使用这个命令要非常小心。

    1. 命令: echo

    echo 的功能正如其名,就是基于标准输出打印一段文本。它和 shell 无关,shell 也不读取通过 echo 命令打印出的内容。然而在一种交互式脚本中,echo 通过终端将信息传递给用户。它是在脚本语言,交互式脚本语言中经常用到的命令。

    root@tecmint:~# echo "Tecmint.com is a very good website" Tecmint.com is a very good website 创建一小段交互式脚本

    1. 在桌面上新建一个文件,命名为 ‘interactive_shell.sh‘ (记住必须带 ‘.sh‘扩展名)。
    2. 复制粘贴如下脚本代码,确保和下面的一致。

    #!/bin/bash echo "Please enter your name:" read name echo "Welcome to Linux $name"

    接下来,设置执行权限并运行脚本。

    root@tecmint:~# chmod 777 interactive_shell.sh root@tecmint:~# ./interactive_shell.sh Please enter your name: Ravi Saive Welcome to Linux Ravi Saive 注意: ‘#!/bin/bash‘ 告诉 shell 这是一个脚本,并且在脚本首行写上这句话是个好习惯。. ‘read‘ 读取给定的输出.

    1. 命令: passwd

    这是一个很重要的命令,在终端中用来改变自己密码很有用。显然的,因为安全的原因,你需要知道当前的密码。

    root@tecmint:~# passwd

    Changing password for tecmint. (current) UNIX password: ******** Enter new UNIX password: ******** Retype new UNIX password: ******** Password unchanged [这里表示密码未改变,例如:新密码=旧密码] Enter new UNIX password: ##### Retype new UNIX password:#####

    1. 命令: lpr

    这个命令用来在命令行上将指定的文件在指定的打印机上打印。

    root@tecmint:~# lpr -P deskjet-4620-series 1-final.pdf

    注意: "lpq"命令让你查看打印机的状态(是开启状态还是关闭状态)和等待打印中的工作 (文件) 的状态。

    1. 命令: cmp

    比较两个任意类型的文件并将结果输出至标准输出。如果两个文件相同, ‘cmp‘默认返回 0;如果不同,将显示不同的字节数和第一处不同的位置。 以下面两个文件为例: file1.txt root@tecmint:~# cat file1.txt Hi My name is Tecmint

    file2.txt root@tecmint:~# cat file2.txt Hi My name is tecmint [dot] com

    比较一下这两个文件,看看命令的输出。

    root@tecmint:~# cmp file1.txt file2.txt file1.txt file2.txt differ: byte 15, line 1

    1. 命令: wget

    Wget 是用于非交互式(例如后台)下载文件的免费工具.支持 HTTP, HTTPS, FTP 协议和 HTTP 代理。 使用 wget 下载 ffmpeg root@tecmint:~# wget http://downloads.sourceforge.net/project/ffmpeg-php/ffmpeg-php/0.6.0/ffmpeg-php-0.6.0.tbz2

    --2013-05-22 18:54:52-- http://downloads.sourceforge.net/project/ffmpeg-php/ffmpeg-php/0.6.0/ffmpeg-php-0.6.0.tbz2 Resolving downloads.sourceforge.net (downloads.sourceforge.net)... 216.34.181.59 Connecting to downloads.sourceforge.net (downloads.sourceforge.net)|216.34.181.59|:80... connected. HTTP request sent, awaiting response... 302 Found Location: http://kaz.dl.sourceforge.net/project/ffmpeg-php/ffmpeg-php/0.6.0/ffmpeg-php-0.6.0.tbz2 [following] --2013-05-22 18:54:54-- http://kaz.dl.sourceforge.net/project/ffmpeg-php/ffmpeg-php/0.6.0/ffmpeg-php-0.6.0.tbz2 Resolving kaz.dl.sourceforge.net (kaz.dl.sourceforge.net)... 92.46.53.163 Connecting to kaz.dl.sourceforge.net (kaz.dl.sourceforge.net)|92.46.53.163|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 275557 (269K) [application/octet-stream] Saving to: ‘ffmpeg-php-0.6.0.tbz2’

    100%[===========================================================================>] 2,75,557 67.8KB/s in 4.0s

    2013-05-22 18:55:00 (67.8 KB/s) - ‘ffmpeg-php-0.6.0.tbz2’ saved [275557/275557]

    37 命令: mount

    mount 是一个很重要的命令,用来挂载不能自动挂载的文件系统。你需要 root 权限挂载设备。 在插入你的文件系统后,首先运行"lsblk"命令,识别出你的设备,然后把分配的设备名记下来。 root@tecmint:~# lsblk

    NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 931.5G 0 disk ├─sda1 8:1 0 923.6G 0 part / ├─sda2 8:2 0 1K 0 part └─sda5 8:5 0 7.9G 0 part [SWAP] sr0 11:0 1 1024M 0 rom
    sdb 8:16 1 3.7G 0 disk └─sdb1 8:17 1 3.7G 0 part

    从这个输出上来看,很明显我插入的是 4GB 的 U 盘,因而 “sdb1” 就是要挂载上来的文件系统。以 root 用户操作,然后切换到/dev 目录,它是所有文件系统挂载的地方。 root@tecmint:~# su Password: root@tecmint:~# cd /dev

    创建一个任何名字的目录,但是最好和引用相关。

    root@tecmint:~# mkdir usb 现在将 “sdb1” 文件系统挂载到 “usb” 目录.

    root@tecmint:~# mount /dev/sdb1 /dev/usb 现在你就可以从终端进入到/dev/usb 或者通过 X 窗口系统从挂载目录访问文件。 是时候让程序猿见识见识 Linux 环境是多么丰富了!

    1. 命令: gcc

    gcc 是 Linux 环境下 C 语言的内建编译器。下面是一个简单的 C 程序,在桌面上保存为 Hello.c(记住必须要有 ‘.c‘扩展名)。 #include int main() { printf("Hello world\n"); return 0; }

    编译

    root@tecmint:~# gcc Hello.c

    运行

    root@tecmint:~# ./a.out

    Hello world

    注意: 编译 C 程序时,输出会自动保存到一个名为 “a.out” 的新文件,因此每次编译 C 程序 “a.out” 都会被修改。 因此编译期间最好定义输出文件名.,这样就不会有覆盖输出文件的风险了。 用这种方法编译

    root@tecmint:~# gcc -o Hello Hello.c

    这里 ‘-o‘将输出写到 ‘Hello‘文件而不是 ‘a.out‘。再运行一次。

    root@tecmint:~# ./Hello Hello world

    1. 命令: g++

    g++ 是 C++ 的内建编译器。下面是一个简单的 C++ 程序,在桌面上保存为 Add.cpp(记住必须要有 ‘.cpp‘扩展名)。 #include

    using namespace std;

    int main() { int a; int b; cout<<"Enter first number:\n"; cin >> a; cout <<"Enter the second number:\n"; cin>> b; cin.ignore(); int result = a + b; cout<<"Result is"<<" "<<result<<endl; cin.get(); return 0; }

    编译

    root@tecmint:~# g++ Add.cpp 运行 root@tecmint:~# ./a.out

    Enter first number: ... ...

    注意:编译 C++ 程序时,输出会自动保存到一个名为 “a.out” 的新文件,因此每次编译 C++ 程序 “a.out” 都会被修改。 因此编译期间最好定义输出文件名.,这样就不会有覆盖输出文件的风险了。 用这种方法编译

    root@tecmint:~# g++ -o Add Add.cpp root@tecmint:~# ./Add Enter first number: ... ...

    1. 命令: java

    Java 是世界上使用最广泛的编程语言之一. 它也被认为是高效, 安全和可靠的编程语言. 现在大多数基于网络的服务都使用 Java 实现. 拷贝以下代码到一个文件就可以创建一个简单的 Java 程序. 不妨把文件命名为 tecmint.java (记住: '.java'扩展名是必需的). class tecmint { public static void main(String[] arguments) { System.out.println("Tecmint "); } } 用 javac 编译 tecmint.java

    root@tecmint:~# javac tecmint.java

    运行 root@tecmint:~# java tecmint

    注意: 几乎所有的 Linux 发行版都带有 gcc 编译器, 大多数发行版都内建了 g++ 和 java 编译器, 有些也可能没有. 你可以用 apt 或 yum 安装需要的包. 请留下您宝贵的意见和想看到的文章类型. 稍后, 我会打来一个很有趣主题, 关于 Linux 的一些鲜为人知的知识.

    1. 命令: ps

    ps 命令给出正在运行的某个进程的状态,每个进程有特定的 id 成为 PID。

    root@tecmint:~# ps

    PID TTY TIME CMD 4170 pts/1 00:00:00 bash 9628 pts/1 00:00:00 ps

    使用 ‘-A‘选项可以列出所有的进程及其 PID。

    root@tecmint:~# ps -A

    PID TTY TIME CMD 1 ? 00:00:01 init 2 ? 00:00:00 kthreadd 3 ? 00:00:01 ksoftirqd/0 5 ? 00:00:00 kworker/0:0H 7 ? 00:00:00 kworker/u:0H 8 ? 00:00:00 migration/0 9 ? 00:00:00 rcu_bh ....

    注意:当你要知道有哪些进程在运行或者需要知道想杀死的进程 PID 时 ps 命令很管用。你可以把它与 ‘grep‘合用来查询指定的输出结果,例如: root@tecmint:~# ps -A | grep -i ssh

    1500 ? 00:09:58 sshd 4317 ? 00:00:00 sshd ps 命令与 grep 命令用管道线分割可以得到我们想要的结果。

    1. 命令: kill

    也许你从命令的名字已经猜出是做什么的了,kill 是用来杀死已经无关紧要或者没有响应的进程.它是一个非常有用的命令,而不是非常非常有用.你可能很熟悉 Windows 下要杀死进程可能需要频繁重启机器因为一个在运行的进程大部分情况下不能够杀死,即使杀死了进程也需要重新启动操作系统才能生效.但在 linux 环境下,事情不是这样的.你可以杀死一个进程并且重启它而不是重启整个操作系统. 杀死一个进程需要知道进程的 PID. 假设你想杀死已经没有响应的 ‘apache2'进程,运行如下命令:

    root@tecmint:~# ps -A | grep -i apache2 1285 ? 00:00:00 apache2

    搜索 ‘apache2'进程,找到 PID 并杀掉它.例如:在本例中 ‘apache2'进程的 PID 是 1285..

    root@tecmint:~# kill 1285 (to kill the process apache2)

    注意:每次你重新运行一个进程或者启动系统,每个进程都会生成一个新的 PID.你可以使用 ps 命令获得当前运行进程的 PID. 另一个杀死进程的方法是:

    root@tecmint:~# pkill apache2

    注意:kill 需要 PID 作为参数,pkill 可以选择应用的方式,比如指定进程的所有者等.

    1. 命令: whereis

    whereis 的作用是用来定位命令的二进制文件\资源\或者帮助页.举例来说,获得 ls 和 kill 命令的二进制文件/资源以及帮助页: root@tecmint:~# whereis ls

    ls: /bin/ls /usr/share/man/man1/ls.1.gz root@tecmint:~# whereis kill kill: /bin/kill /usr/share/man/man2/kill.2.gz /usr/share/man/man1/kill.1.gz 注意:当需要知道二进制文件保存位置时有用.

    1. 命令: service

    ‘service‘命令控制服务的启动、停止和重启,它让你能够不重启整个系统就可以让配置生效以开启、停止或者重启某个服务。 在 Ubuntu 上启动 apache2 server:

    root@tecmint:~# service apache2 start

    * Starting web server apache2
    apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName httpd (pid 1285) already running [ OK ]

    重启 apache2 server: root@tecmint:~# service apache2 restart * Restarting web server apache2
    apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName ... waiting .apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName [ OK ] 停止 apache2 server:

    root@tecmint:~# service apache2 stop

    * Stopping web server apache2
    apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName ... waiting [ OK ] 注意:要想使用 service 命令,进程的脚本必须放在 ‘/etc/init.d‘,并且路径必须在指定的位置。 如果要运行 “service apache2 start” 实际上实在执行 “service /etc/init.d/apache2 start”.

  • 新人求教 at 2013年08月12日

    [code]#!/bin/perl

    #system ("systeminfo >D://project//result.txt");

    my $myresult="result.txt"; open(file,"<$myresult") || die "Cannot open file: $myresult"; @osresult=; chomp @osresult; open(LOG,">>projectr.txt"); foreach $osresult (@osresult) { if($osresult=~/^os/i) { print("$osresult\n"); print LOG $osresult; }
    } close LOG;[/code] 我是在 cygwin 下执行的

  • 每次都访问 svn 库读取信息,还不如临时 export 到本地,再统计方便。

    或者在服务器端 export 出文件,统计后把结果反馈回来。

  • 新人求教 at 2013年08月12日

    把脚本上传上来,让大家帮你看看

    1. sudo 命令

    “sudo”(super user do) 命令允许授权用户执行超级用户或者其它用户的命令。通过在 sudoers 列表的安全策略来指定。 root@tecmint:~# sudo add-apt-repository ppa:tualatrix/ppa 注意:sudo 允许用户借用超级用户的权限,然而"su"命令实际上是允许用户以超级用户登录。所以 sudo 比 su 更安全。 并不建议使用 sudo 或者 su 来处理日常用途,因为它可能导致严重的错误如果你意外的做错了事,这就是为什么在 linux 社区流行一句话: “To err is human, but to really foul up everything, you need root password.” “人非圣贤孰能无过,但是拥有 root 密码就真的万劫不复了。”

    1. mkdir 命令

    “mkdir”(Make directory) 命令在命名路径下创建新的目录。然而如果目录已经存在了,那么它就会返回一个错误信息"不能创建文件夹,文件夹已经存在了"("cannot create folder, folder already exists") root@tecmint:~# mkdir tecmint 注意:目录只能在用户拥有写权限的目录下才能创建。mkdir:不能创建目录tecmint,因为文件已经存在了。(上面的输出中不要被文件迷惑了,你应该记住我开头所说的 - 在 linux 中,文件,文件夹,驱动,命令,脚本都视为文件)

    1. touch 命令

    “touch” 命令代表了将文件的访问和修改时间更新为当前时间。touch 命令只会在文件不存在的时候才会创建它。如果文件已经存在了,它会更新时间戳,但是并不会改变文件的内容。 root@tecmint:~# touch tecmintfile 注意:touch 可以用来在用户拥有写权限的目录下创建不存在的文件。

    1. chmod 命令

    “chmod” 命令就是改变文件的模式位。chmod 会根据要求的模式来改变每个所给的文件,文件夹,脚本等等的文件模式(权限)。 在文件 (文件夹或者其它,为了简单起见,我们就使用文件) 中存在 3 中类型的权限 Read (r)=4 Write(w)=2 Execute(x)=1 所以如果你想给文件只读权限,就设置为'4';只写权限,设置权限为'2';只执行权限,设置为 1; 读写权限,就是 4+2 = 6, 以此类推。 现在需要设置 3 种用户和用户组权限。第一个是拥有者,然后是用户所在的组,最后是其它用户。 rwxr-x--x abc.sh 这里 root 的权限是 rwx(读写和执行权限), 所属用户组权限是 r-x (只有读和执行权限, 没有写权限), 对于其它用户权限是 -x(只有只执行权限) 为了改变它的权限,为拥有者,用户所在组和其它用户提供读,写,执行权限。 root@tecmint:~# chmod 777 abc.sh 三种都只有读写权限 root@tecmint:~# chmod 666 abc.sh 拥有者用户有读写和执行权限,用户所在的组和其它用户只有可执行权限 root@tecmint:~# chmod 711 abc.sh 注意:对于系统管理员和用户来说,这个命令是最有用的命令之一了。在多用户环境或者服务器上,对于某个用户,如果设置了文件不可访问,那么这个命令就可以解决,如果设置了错误的权限,那么也就提供了为授权的访问。

    1. chown 命令

    “chown” 命令就是改变文件拥有者和所在用户组。每个文件都属于一个用户组和一个用户。在你的目录下,使用"ls -l",你就会看到像这样的东西。 root@tecmint:~# ls -l drwxr-xr-x 3 server root 4096 May 10 11:14 Binary drwxr-xr-x 2 server server 4096 May 13 09:42 Desktop 在这里,目录 Binary 属于用户"server",和用户组"root",而目录"Desktop"属于用户 “server” 和用户组"server" “chown” 命令用来改变文件的所有权,所以仅仅用来管理和提供文件的用户和用户组授权。 root@tecmint:~# chown server:server Binary drwxr-xr-x 3 server server 4096 May 10 11:14 Binary drwxr-xr-x 2 server server 4096 May 13 09:42 Desktop 注意:“chown” 所给的文件改变用户和组的所有权到新的拥有者或者已经存在的用户或者用户组。

    1. apt 命令

    Debian 系列以 “apt” 命令为基础,“apt” 代表了 Advanced Package Tool。APT 是一个为 Debian 系列系统(Ubuntu,Kubuntu 等等)开发的高级包管理器,在 Gnu/Linux 系统上,它会为包自动地,智能地搜索,安装,升级以及解决依赖。 root@tecmint:~# apt-get install mplayer Reading package lists... Done Building dependency tree
    Reading state information... Done The following package was automatically installed and is no longer required: java-wrappers Use 'apt-get autoremove' to remove it. The following extra packages will be installed: esound-common libaudiofile1 libesd0 libopenal-data libopenal1 libsvga1 libvdpau1 libxvidcore4 Suggested packages: pulseaudio-esound-compat libroar-compat2 nvidia-vdpau-driver vdpau-driver mplayer-doc netselect fping The following NEW packages will be installed: esound-common libaudiofile1 libesd0 libopenal-data libopenal1 libsvga1 libvdpau1 libxvidcore4 mplayer 0 upgraded, 9 newly installed, 0 to remove and 8 not upgraded. Need to get 3,567 kB of archives. After this operation, 7,772 kB of additional disk space will be used. Do you want to continue [Y/n]? y root@tecmint:~# apt-get update Hit http://ppa.launchpad.net raring Release.gpg
    Hit http://ppa.launchpad.net raring Release.gpg
    Hit http://ppa.launchpad.net raring Release.gpg
    Hit http://ppa.launchpad.net raring Release.gpg
    Get:1 http://security.ubuntu.com/url][ raring-security Release.gpg [933 B] Hit http://in.archive.ubuntu.com/url][ raring Release.gpg
    Hit http://ppa.launchpad.net raring Release.gpg
    Get:2 [url]http://security.ubuntu.com raring-security Release [40.8 kB]
    Ign http://ppa.launchpad.net raring Release.gpg
    Get:3 http://in.archive.ubuntu.com raring-updates Release.gpg [933 B]
    Hit http://ppa.launchpad.net raring Release.gpg
    Hit [url]http://in.archive.ubuntu.com raring-backports Release.gpg 注意:上面的命令会导致系统整体的改变,所以需要 root 密码(查看提示符为"#",而不是 “$”).和 yum 命令相比,Apt 更高级和智能。 见名知义,apt-cache 用来搜索包中是否包含子包 mplayer, apt-get 用来安装,升级所有的已安装的包到最新版。 关于 apt-get 和 apt-cache 命令更多信息,请查看 25 APT-GET 和 APT-CACHE 命令

    1. tar 命令

    “tar” 命令是磁带归档 (Tape Archive),对创建一些文件的的归档和它们的解压很有用。 root@tecmint:~# tar -zxvf abc.tar.gz (记住'z'代表了.tar.gz) root@tecmint:~# tar -jxvf abc.tar.bz2 (记住'j'代表了.tar.bz2) root@tecmint:~# tar -cvf archieve.tar.gz(.bz2) /path/to/folder/abc 注意: "tar.gz"代表了使用 gzip 归档,“bar.bz2” 使用 bzip 压缩的,它压缩的更好但是也更慢。 了解更多"tar 命令"的例子,请查看 18 Tar 命名例子

    1. cal 命令

    “cal”(Calender),它用来显示当前月份或者未来或者过去任何年份中的月份。 root@tecmint:~# cal May 2013

    Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 显示已经过去的月份,1835 年 2 月 root@tecmint:~# cal 02 1835 February 1835
    Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 显示未来的月份,2145 年 7 月。

    root@tecmint:~# cal 07 2145 July 2145
    Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 注意: 你不需要往回调整日历 50 年,既不用复杂的数据计算你出生那天,也不用计算你的生日在哪天到来,[因为它的最小单位是月,而不是日]。

    1. date 命令

    “date” 命令使用标准的输出打印当前的日期和时间,也可以深入设置。

    root@tecmint:~# date Fri May 17 14:13:29 IST 2013 root@tecmint:~# date --set='14 may 2013 13:57' Mon May 13 13:57:00 IST 2013 注意:这个命令在脚本中十分有用,以及基于时间和日期的脚本更完美。而且在终端中改变日期和时间,让你更专业!!!(当然你需要 root 权限才能操作这个,因为它是系统整体改变)

    1. cat 命令

    “cat” 代表了连结(Concatenation),连接两个或者更多文本文件或者以标准输出形式打印文件的内容。 root@tecmint:~# cat a.txt b.txt c.txt d.txt abcd.txt root@tecmint:~# cat abcd.txt .... contents of file abcd ... 注意:“>>” 和 “>” 调用了追加符号。它们用来追加到文件里,而不是显示在标准输出上。“>” 符号会删除已存在的文件,然后创建一个新的文件。所以因为安全的原因,建议使用 “>>”,它会写入到文件中,而不是覆盖或者删除。

    在深入探究之前,我必须让你知道通配符 (你应该知道通配符,它出现在大多数电视选秀中)。通配符是 shell 的特色,和任何 GUI 文件管理器相比,它使命令行更强大有力!如你所看到那样,在一个图形文件管理器中,你想选择一大组文件,你通常不得不使用你的鼠标来选择它们。这可能觉得很简单,但是事实上,这种情形很让人沮丧! 例如,假如你有一个有很多很多各种类型的文件和子目录的目录,然后你决定移动所有文件名中包含 “Linux” 字样的 HTML 文件到另外一个目录。如何简单的完成这个?如果目录中包含了大量的不同名的 HTML 文件,你的任务很巨大,而不是简单了。 在 LInux CLI 中,这个任务就很简单,就好像只移动一个 HTML 文件,因为有 shell 的通配符,才会如此简单。这些是特殊的字符,允许你选择匹配某种字符模式的文件名。它帮助你来选择,即使是大量文件名中只有几个字符,而且在大多数情形中,它比使用鼠标选择文件更简单。 这里就是常用通配符列表:

    Wildcard Matches

    • 零个或者更多字符 ? 恰好一个字符 [abcde] 恰好列举中的一个字符 [a-e] 恰好在所给范围中的一个字符 [! abcde] 任何字符都不在列举中 [! a-e] 任何字符都不在所给的范围中 {debian,linux} 恰好在所给选项中的一整个单词 ! 叫做非,带'!'的反向字符串为真 更多请阅读 Linux cat 命令的实例 13 Linux 中 cat 命令实例
    1. cp 命令

    “copy” 就是复制。它会从一个地方复制一个文件到另外一个地方。 1 root@tecmint:~# cp /home/user/Downloads abc.tar.gz /home/user/Desktop (Return 0 when sucess) 注意: cp,在 shell 脚本中是最常用的一个命令,而且它可以使用通配符(在前面一块中有所描述),来定制所需的文件的复制。

    1. mv 命令

    “mv” 命令将一个地方的文件移动到另外一个地方去。 root@tecmint:~# mv /home/user/Downloads abc.tar.gz /home/user/Desktop (Return 0 when sucess) 注意:mv 命令可以使用通配符。mv 需谨慎使用,因为移动系统的或者未授权的文件不但会导致安全性问题,而且可能系统崩溃。

    1. pwd 命令

    “pwd”(print working directory),在终端中显示当前工作目录的全路径。

    root@tecmint:~# pwd /home/user/Desktop 注意: 这个命令并不会在脚本中经常使用,但是对于新手,当从连接到 nux 很久后在终端中迷失了路径,这绝对是救命稻草。

    1. cd 命令

    最后,经常使用的 “cd” 命令代表了改变目录。它在终端中改变工作目录来执行,复制,移动,读,写等等操作。

    root@tecmint:~# cd /home/user/Desktop

    server@localhost:~$ pwd /home/user/Desktop 注意: 在终端中切换目录时,cd 就大显身手了。“cd ~” 会改变工作目录为用户的家目录,而且当用户发现自己在终端中迷失了路径时,非常有用。“cd ..” 从当前工作目录切换到 (当前工作目录的) 父目录。 这些命令肯定会让你在 Linux 上很舒服。但是这并不是结束。不久,我就会写一些其它的针对于中级用户的有用命令。例如,如果你熟练使用这些命令,欢呼吧,少年,你会发现你已从小白级别提升为了中级用户了。在下篇文章,我会介绍像 “kill”,"ps","grep"等等命令,期待吧,我不会让你失望的。

    1. md5sum 命令

    “md5sum” 就是计算和检验 MD5 信息签名。md5 checksum(通常叫做哈希) 使用匹配或者验证文件的文件的完整性,因为文件可能因为传输错误,磁盘错误或者无恶意的干扰等原因而发生改变。 root@tecmint:~# md5sum teamviewer_linux.deb 47790ed345a7b7970fc1f2ac50c97002 teamviewer_linux.deb 注意:用户可以使用官方提供的和 md5sum 生成签名信息匹对以此检测文件是否改变。Md5sum 没有 sha1sum 安全,这点我们稍后讨论。

    1. dd 命令

    “dd” 命令代表了转换和复制文件。可以用来转换和复制文件,大多数时间是用来复制 iso 文件 (或任何其它文件) 到一个 usb 设备 (或任何其它地方) 中去,所以可以用来制作 USB 启动器。 root@tecmint:~# dd if=/home/user/Downloads/debian.iso of=/dev/sdb1 bs=512M; sync 注意:在上面的例子中,usb 设备就是 sdb1(你应该使用 lsblk 命令验证它,否则你会重写你的磁盘或者系统),请慎重使用磁盘的名,切忌。 dd 命令在执行中会根据文件的大小和类型 以及 usb 设备的读写速度,消耗几秒到几分钟不等。

    1. uname 命令

    "uname"命令就是 Unix Name 的简写。显示机器名,操作系统和内核的详细信息。 root@tecmint:~# uname -a Linux tecmint 3.8.0-19-generic #30-Ubuntu SMP Wed May 1 16:36:13 UTC 2013 i686 i686 i686 GNU/Linux 注意: uname 显示内核类别, uname -a 显示详细信息。上面的输出详细说明了 uname -a “Linux“: 机器的内核名 “tecmint“: 机器的节点名 “3.8.0-19-generic“: 内核发布版本 “#30-Ubuntu SMP“: 内核版本 “i686“: 处理器架构 “GNU/Linux“: 操作系统名

    1. history 命令

    “history” 命令就是历史记录。它显示了在终端中所执行过的所有命令的历史。 root@tecmint:~# history 1 sudo add-apt-repository ppa:tualatrix/ppa 2 sudo apt-get update 3 sudo apt-get install ubuntu-tweak 4 sudo add-apt-repository ppa:diesch/testing 5 sudo apt-get update 6 sudo apt-get install indicator-privacy 7 sudo add-apt-repository ppa:atareao/atareao 8 sudo apt-get update 9 sudo apt-get install my-weather-indicator 10 pwd 11 cd && sudo cp -r unity/6 /usr/share/unity/ 12 cd /usr/share/unity/icons/ 13 cd /usr/share/unity 注意:按住 “CTRL + R” 就可以搜索已经执行过的命令,它可以在你写命令时自动补全。 (reverse-i-search)`if': ifconfig

    1. lsblk 命令

    "lsblk"就是列出块设备。除了 RAM 外,以标准的树状输出格式,整齐地显示块设备。 root@tecmint:~# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 232.9G 0 disk ├─sda1 8:1 0 46.6G 0 part / ├─sda2 8:2 0 1K 0 part ├─sda5 8:5 0 190M 0 part /boot ├─sda6 8:6 0 3.7G 0 part [SWAP] ├─sda7 8:7 0 93.1G 0 part /data └─sda8 8:8 0 89.2G 0 part /personal sr0 11:0 1 1024M 0 rom

    “lsblk -l” 命令以列表格式显示块设备 (而不是树状格式)。 root@tecmint:~# lsblk -l NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 232.9G 0 disk sda1 8:1 0 46.6G 0 part / sda2 8:2 0 1K 0 part sda5 8:5 0 190M 0 part /boot sda6 8:6 0 3.7G 0 part [SWAP] sda7 8:7 0 93.1G 0 part /data sda8 8:8 0 89.2G 0 part /personal sr0 11:0 1 1024M 0 rom 注意:lsblk 是最有用和最简单的方式来了解新插入的 USB 设备的名字,特别是当你在终端上处理磁盘/块设备时。

  • 新人求教 at 2013年08月09日

    先自己尝试着写,而不是把问题推给别人。

    如果写完了有问题,大家倒是可以一起研究