Posts in category shell

Linux shell 之计算圆周率

http://blog.devep.net/virushuo/2014/01/21/delllinux_kernel_bugcpu.html (Dell服务器和Linux kernel bug造成的CPU性能下降问题) 看到的,本意是通过计算圆周率确认服务器的CPU性能,只需要如下简单的一行命令:

time echo "scale=5000; 4*a(1)" | bc -l -q

在我的笔记本上执行的情况如下:

3.141592653589793238462643383279502884197169399375105820974944592307\
81640628620899862803482534211706798214808651328230664709384460955058\
22317253594081284811174502841027019385211055596446229489549303819644\
28810975665933446128475648233786783165271201909145648566923460348610\
45432664821339360726024914127372458700660631558817488152092096282925\
40917153643678925903600113305305488204665213841469519415116094330572\
70365759591953092186117381932611793105118548074462379962749567351885\
75272489122793818301194912983367336244065664308602139494639522473719\
07021798609437027705392171762931767523846748184676694051320005681271\
45263560827785771342757789609173637178721468440901224953430146549585\
37105079227968925892354201995611212902196086403441815981362977477130\
99605187072113499999983729780499510597317328160963185950244594553469\
08302642522308253344685035261931188171010003137838752886587533208381\
42061717766914730359825349042875546873115956286388235378759375195778\
18577805321712268066130019278766111959092164201989380952572010654858\
63278865936153381827968230301952035301852968995773622599413891249721\
77528347913151557485724245415069595082953311686172785588907509838175\
46374649393192550604009277016711390098488240128583616035637076601047\
10181942955596198946767837449448255379774726847104047534646208046684\
25906949129331367702898915210475216205696602405803815019351125338243\
00355876402474964732639141992726042699227967823547816360093417216412\
19924586315030286182974555706749838505494588586926995690927210797509\
30295532116534498720275596023648066549911988183479775356636980742654\
25278625518184175746728909777727938000816470600161452491921732172147\
72350141441973568548161361157352552133475741849468438523323907394143\
33454776241686251898356948556209921922218427255025425688767179049460\
16534668049886272327917860857843838279679766814541009538837863609506\
80064225125205117392984896084128488626945604241965285022210661186306\
74427862203919494504712371378696095636437191728746776465757396241389\
08658326459958133904780275900994657640789512694683983525957098258226\
20522489407726719478268482601476990902640136394437455305068203496252\
45174939965143142980919065925093722169646151570985838741059788595977\
29754989301617539284681382686838689427741559918559252459539594310499\
72524680845987273644695848653836736222626099124608051243884390451244\
13654976278079771569143599770012961608944169486855584840635342207222\
58284886481584560285060168427394522674676788952521385225499546667278\
23986456596116354886230577456498035593634568174324112515076069479451\
09659609402522887971089314566913686722874894056010150330861792868092\
08747609178249385890097149096759852613655497818931297848216829989487\
22658804857564014270477555132379641451523746234364542858444795265867\
82105114135473573952311342716610213596953623144295248493718711014576\
54035902799344037420073105785390621983874478084784896833214457138687\
51943506430218453191048481005370614680674919278191197939952061419663\
42875444064374512371819217999839101591956181467514269123974894090718\
64942319615679452080951465502252316038819301420937621378559566389377\
87083039069792077346722182562599661501421503068038447734549202605414\
66592520149744285073251866600213243408819071048633173464965145390579\
62685610055081066587969981635747363840525714591028970641401109712062\
80439039759515677157700420337869936007230558763176359421873125147120\
53292819182618612586732157919841484882916447060957527069572209175671\
16722910981690915280173506712748583222871835209353965725121083579151\
36988209144421006751033467110314126711136990865851639831501970165151\
16851714376576183515565088490998985998238734552833163550764791853589\
32261854896321329330898570642046752590709154814165498594616371802709\
81994309924488957571282890592323326097299712084433573265489382391193\
25974636673058360414281388303203824903758985243744170291327656180937\
73444030707469211201913020330380197621101100449293215160842444859637\
66983895228684783123552658213144957685726243344189303968642624341077\
32269780280731891544110104468232527162010526522721116603966655730925\
47110557853763466820653109896526918620564769312570586356620185581007\
29360659876486117910453348850346113657686753249441668039626579787718\
55608455296541266540853061434443185867697514566140680070023787765913\
44017127494704205622305389945613140711270004078547332699390814546646\
45880797270826683063432858785698305235808933065757406795457163775254\
20211495576158140025012622859413021647155097925923099079654737612551\
76567513575178296664547791745011299614890304639947132962107340437518\
95735961458901938971311179042978285647503203198691514028708085990480\
10941214722131794764777262241425485454033215718530614228813758504306\
33217518297986622371721591607716692547487389866549494501146540628433\
66393790039769265672146385306736096571209180763832716641627488880078\
69256029022847210403172118608204190004229661711963779213375751149595\
01566049631862947265473642523081770367515906735023507283540567040386\
74351362222477158915049530984448933309634087807693259939780541934144\
73774418426312986080998886874132604720

real	0m21.420s
user	0m21.397s
sys	0m0.001s

Linux shell 获得当前脚本文件所在的目录

这基本上是一个非常常见的需求,不过考虑到兼容性: 1)目录或者文件名中空格;2)对通过link的形式引用;3)通过. ./test.sh这样的方式调用,要做出一个比较完美的方案也不是那么容易。

首先看看主流的做法:

另外一个来源:

  • http://www.cyberciti.biz/faq/unix-linux-appleosx-bsd-bash-script-find-what-directory-itsstoredin/
    #!/bin/bash
    # Name: /tmp/demo.bash : 
    # Purpose: Tell in what directory $0 is stored in
    # Warning: Not tested for portability 
    # ------------------------------------------------
     
    ## who am i? ##
    _script="$(readlink -f ${BASH_SOURCE[0]})"
     
    ## Delete last component from $_script ##
    _base="$(dirname $_script)"
     
    ## Okay, print it ##
    echo "Script name : $_script"
    echo "Current working dir : $PWD"
    echo "Script location path (dir) : $_base"
    
  • 这个脚本只支持 bash,经测试,对空格的支持存在问题。

考虑实际情况(总是在 bash 下面),对上面脚本修改一下,我最终使用的方案是:

#!/bin/bash

if [ -z $BASH ]; then
    echo "This shell script MUST run under bash."
    exit /b -1
fi
_script="$(readlink -f "${BASH_SOURCE[0]}")"
_script_dir="$(dirname "$_script")"
echo "Directory portion of $_script : $_script_dir"

Linux 下定期屏幕截屏脚本(补 20111120)

原文来自 https://code.google.com/p/thinkbasenet/wiki/20111120_ScreenRecorderShellInLinux

概述

在上一篇 Windows 和 Linux 下定期屏幕截屏的方法 中提到了可以使用 ImageMagickimport 命令完成截屏过程, 本文基于 import 命令, 提供两个脚本, 分别用于定期截取当前活动窗口, 以及定期截取指定窗口;

脚本

主要技术说明

import 命令

  • -screen 参数: 不了解 X 的细节, 猜测对于一个典型的 X 窗口, 其中的工具提示、菜单等其实是有独立的 window id 的, 那么在指定 window id 截屏时, 可能是截取不到这些内容的, 使用 -screen 参数可以解决这个问题:
    • 没有 -screen 参数时的内容:
    • 加上 -screen 参数:

取得窗口的 window id 和 process id

  1. 获取当前活动窗口的 window id:
    • xprop -root | grep "_NET_ACTIVE_WINDOW(WINDOW)"| cut -d ' ' -f 5
  2. 使用 xwininfo 选择一个窗口并获取其 window id:
    • xwininfo | grep "xwininfo: Window id:" | cut -d ' ' -f 4
  3. 获取窗口($WIN_ID)对应的进程 ID:
    • xprop -id $WIN_ID | grep "_NET_WM_PID(CARDINAL)" | cut -d ' ' -f 3

比较截屏文件是否一致

  • 使用 cmp 命令即可.

END

Windows 和 Linux 下定期屏幕截屏的方法(补 20101114)

原文来自 https://code.google.com/p/thinkbasenet/wiki/20101114_ScreenShotAsFilesInWindowsAndLinux

截屏并存储到文件的方法, 主要是可以用于录制操作视频, 或者日志重要系统操作过程, 以及测试过程等.

简介

一直以来使用 Wink 作为屏幕录制的首选软件, 但是 Wink 存在一个很麻烦的问题, 就是在录制途中, 所有的屏幕截屏都存储在内存里, 因此在很长时间的操作中, 往往会造成内存溢出, 导致前功尽弃.

有一个想法是写一个录制屏幕并且及时存储到图片文件的软件, 最初的想法是使用 Java 来写, 但是一直都没有开始; 今天无意中看到了 nircmd 这个软件, 其中的命令 savescreenshot 可以较好的完成这个要求:

nircmdc.exe loop 1000 2000 savescreenshot c:\temp\scr~$currdate.MM_dd_yyyy$-~$currtime.HH_mm_ss$.png 

loop 1000 2000 代表循环 1000 次, 间隔时间 2 秒(2000 毫秒);

使用 nircmdc 可以保证 1000 次循环完成之前, 命令行一直停留在这个命令上, 方便不需要的时候使用 Ctrl-C 结束截屏过程;

另外还可以使用 savescreenshotwin 命令保存当前活动窗口的命令;

Linux 下的处理方法

使用 nircmdc 可以在 Windows 下实现定时截屏的要求, 但是在 Linux 下又如何实现呢? 经过一番搜索, 大致的解决方案如下:

  1. 基于 ImageMagick, 使用其 import 命令完成截屏过程, 基本语法为:
    import -window <Window ID> <FileName>.png
    
  2. 如果需要截取整个屏幕, 可以使用 root 作为 Window ID, 例如:
    import -window root MyScreenshot3.png
    
  3. 如何实现截取当前活动窗口呢? 可以使用如下命令得到当前活动窗口 ID:
    xprop -root | grep "_NET_ACTIVE_WINDOW(WINDOW)"| cut -d ' ' -f 5
    
  4. 20111120 添加 - Linux 下定期屏幕截屏脚本;

下载

其它

  1. 减少文件大小
    • 如果屏幕内容一直不变, 那么就会出现重复录取同一个画面的情况, 应该可以通过一个脚本使用 md5sum 等命令检查两张图片是否完全一样, 删除重复内容的图片, 这样就可以实现减少文件大小的目的了.

参考资料

  1. http://tips.webdesign10.com/how-to-take-a-screenshot-on-ubuntu-linux
    • "How to Take a Screenshot in Linux (Ubuntu)", 描述了在 Ubuntu 上几种截屏的方法;
  2. http://www.charry.org/docs/linux/ImageMagick/ImageMagick.html
    • "我的ImageMagick使用心得", ImageMagick 的中文介绍;
  3. http://www.ruby-forum.com/topic/165740#728314
    • "Title from current active window", Ruby-Gnome 2 论坛的讨论;

END