shell 学习笔记(19)

声明:转载需署名出处,严禁用于商业用途!

1801.关于 nohup 后台运行的问题:
    nohup就是拒绝hup信号,没什么其他用途,
    如果是shopt -s huponexit的话,shell在退出的时候自己把自己所有的子进程都发一个hup信号,
    然后就退出了,但是我还没见过哪种发行版会启用这个参数的。
    后台就直接加个&就行了:sh 1.sh & ,退出终端并不会终端程序,sleep 9999 &,然后退出,然后再登录,看下是不是还在 
    除非你shopt -s huponexit 才会断掉,默认是不会有这个的 ,其实可以直接在脚本内部trap hup信号,这样和nohup就一样了 
    shopt |grep hup看下,如果是off,就不用nohup
    用ping测试了不行,ping是需要tty的,ping自己会判断,如果失去tty就退出
1802.sort的默认分隔符:blank
    sort默认就是[ \t]:By default a blank is a space or a tab,blank是空白符,不是空格符,空格是space 
1803.lastb : 登录不成功用户记录
1804.lsof监控进程或者程序
    lsof -i:22 //知道22端口现在运行什么程序
    lsof -c abc //显示abc进程现在打开的文件
    lsof -p 12  //看进程号为12的进程打开了哪些文件
1805.设置 chattr 让root无法修改:chattr +i file,lsattr file //查看文件属性
1806.mkfs -t vfat /dev/hda6 :将移动硬盘里面的一个分区格式化成vfat格式
1807.mount /dev/cdrom /media/cdrom  //挂载cdrom
1808.getent group 532 //通过组ID,来查找组信息
1809.linux的备份还原:
    dump -S /dev/sda2 //查看一下要备份/dev/sda2所要的容量
    dump -0j -f /dev/hda2/sda2_bak.dump.bz2 /dev/sda2  //将sda2进行备份并压缩
    restore -t -f /dev/hda2/sda2_bak.dump  //查看备份信息
    restore -r -f /dev/hda2/sda2_bak.dump  //还原备份
1810.linux添加、删除网段路由:
    route del -net 172.168.0.0 netmask 255.255.0.0 dev eth0 //删除 172.168这个网段
1811.nmap安全扫描:
    nmap -sP 172.30.4.0/24  //在这个网段内有多少用户在我的主机上操作,一个不错的安全检查工具
1812./sbin/killall5 杀死除了内核线程和自己的session(当前shell)之外的所有进程(root会把当前shell也杀了),sysvinit-utils里面带的
1813.perl正则:环视 不匹配多个字符
    (?<=) (?=)    # 每组环视都成对出现,分为前视、后视
    (?<!) (?!)
    匹配到非行首的2013的正则:
    echo "20130331_ershouch_putong_post_phoneQuit 120130401_ershouch"|grep -P '(?<!^)2013'        # 绕一点的写法:grep -P '(?!^2013)2013'
1814.文件名乱码后,file -i 查看编码:
    ls|file -i - 
    /dev/stdin: text/plain; charset=utf-8
1815.linux 如何复制用户信息到另一台机器
    1. 复制3个文件:/etc/passwd,/etc/group,/etc/shadow
    2. 为各个用户创建home目录
    3.复制用户home目录下的.bashrc .bash_profile
1816.从世界标准时间中心获取时间:
    ntpdate 0.pool.ntp.org
1817.alias只是在交互式shell下才有生效,因为其他环境不会执行profile和rc 
1818.关于cp覆盖一个正在运行的文件,遇到:cp: cannot create regular file `test': Text file busy
    其实这是新版本linux的一个特性,老版本没这个问题,而且二进制文件没问题,文本文件有问题 
    当时一个脚本,换到debian7上怎么都不行,发现是flock的问题,新版本的flock,如果你flock一个脚本,
    那么这个脚本就没法执行了,二进制文件没事。 我去官网找源码编译了下,果然是这样,应该在某个版本的时候改了策略 
1819.control + c 发送 SIGINT 信号的问题:
    如果你用kill指令而不带任何参数,实际上是发送了一个SIGKILL信号。但是kill指令是可以发送指定信号的,
    比如你要发一个SIGINT信号,可以这样:kill -s SIGINT process_name
1820.awk -F 域分隔符转义问题:
    echo 1[ab]2[ab]3[ab]4|awk -F'\\[ab]' '{print $2}'    #注意单引号、斜杠问题,其实完整的后一个也要转义的。
1821.convmv 转换文件名编码,其实这是一个 perl 脚本:
    11:19:40#tp#test> echo 中国|iconv -f utf-8 -t gbk|xargs touch
    11:19:47#tp#test> ls
    ?й?
    11:21:32#tp#test> convmv -f gbk -t utf-8 * --notest
    Your Perl version has fleas #37757 #49830
1822.tail -f 和 grep 进行日志的实时监控:# 其实tail -f用的就是inotify 
    tail -fn0 /var/log/php.log|grep --line-buffered error|while read line
    do
        echo $line|mail -s error abc@g.cn
    done 
1823.大量time-wait:netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
    #vi /etc/sysctl.conf
    net.ipv4.tcp_tw_reuse = 1        #将TIME-WAIT sockets重用
    net.ipv4.tcp_tw_recycle = 1        #开启TCP连接中TIME-WAIT sockets的快速回收
    # 注意 tcp_timestamps, tcp_tw_resycle 不要同时开启
    # http://blog.sina.com.cn/s/blog_781b0c850100znjd.html   
    # http://www.litrin.net/2013/03/01/android%E4%B9%8B%E7%BD%91%E7%BB%9C%E4%B8%A2%E5%8C%85%E4%BA%8B%E4%BB%B6/
    #sysctl -p
1824.使用 LC_ALL=C 的意义:
    Linux中有关locale的设置会影响大量的命令行工具,其中包括排序工具。
    多数安装的Linux系统都将LANG或者其他的locale默认设置成US English。
    但这可能会导致排序及其他命令慢上好几倍。
    因此export LC_ALL=C 能避免使用i18n形式处理数据,带来性能提升。
1825.了解sort的常用选项 (-t,-k, -s)如何工作:
    注意-k1,1只会排序第一列,而-k1会根据整个行排序。 -s能实现稳定排序。
    例如,先使用第二个域排序,再按照域一排序,可以用这段命令实现
    cat INPUT_FILE | sort -k1,1  | sort -s -k2,2
    echo "\
    2 1
    1 1"|sort -sk2,2
    这个只是在 col2 有相同值的时候,保持其它列的顺序维持不变
1826.需要输入制表符,可以使用 Ctrl-V <tab> 或者 Ctrl-V-I 或者  $'t'
1827.kill -3 <pid>:SIGQUIT
    在调试Java程序时,使用此命令,可以在stderr/logs中找到完整的stack trace,堆信息(包含垃圾收集的细节).
1828.curl 设置超时时间,并获取返回码:
    curl -m9 g.cn/a.gif -so a.gif -w '%{http_code}\n'
1829.curl FTP 下载文件:
    curl -T "{file1,file2}" http://www.uploadtothissite.com 或者这个也是支持的,man curl里面有
    -X PUT 就是 -T ,--ftp-method 指定ftp方式,比如get还是put
1830.ls -A和-a的区别是-A不显示.和.. 
1831.一些配置文件的路径区别:
    profile是login shell,rc是non-login shell,etc下面是共用的,自己目录下面是用户自己的。
1832.通过 secure CRT 的 sftp 协议上传下载文件:
    与远程LINUX服务器交换数据。一般情况下通过以下几种。
    1、是通过NFS通过MOUNT来挂接远程WINDOWS共享的网络文件系统CFIS进行数据交换。
    2、通过HTTP单方面交换数据。
    3、通过FTP来交换数据。
    4、通过SFTP使用SSH交换数据,这个功能利用了Secure CRT和SSH的功能来实现,非常简单也需要中转服务器。
    sftp> lcd C:/Users/june/Desktop
    sftp> lpwd
    C:/Users/june/Desktop
    sftp> get part-r-00000
1833.在linux下如何将中文目录压缩成中文压缩包
    rar和7z可以保存编码,其他都不行,zip、tar打包的要在同一操作系统解压,否则是乱码。 
    unix用tar打包的文件,在windows下解压是乱码,因为当时unix下是utf-8的,然后windows下是gbk的,
    所以如果你把U盘拿回linux上,用utf-8挂载,又是中文了。
    要看挂载的时候的编码,如果都是gbk的话,是一样的。现在对于fat和nfts,默认就是用gbk编码挂载的 
    当然,windows是没法选择挂载的时候的字符编码的,文件编码和挂载的时候的编码没关系的 
    linux 可以选择挂载编码:mount后面有参数的,iocharset 
1834.rsync 的 --exclude 排除文件/文件夹用法:
    --exclude=/dir 只排除 /dir
    --exclude=dir 排除/dir abc/dir a/dir
    /data/dir
    /data/abc/dir
    如果你用--exclude=dir,那么上面两个都被排除了,
    其实相对路径就是通配所有的路径,绝对路径只排除一个
    --exclude-from=FILE是你要exclude的所有东西都写在FILE这个文件里面,每个一行
    10:35:22#tp#test> find
    .
    ./d
    ./s
    ./s/a
    ./s/b
    ./s/b/a
    10:35:46#tp#test> rsync -nav --exclude=a s/ d/
    sending incremental file list
    ./
    b/
    10:35:59#tp#test> rsync -nav --exclude=/a s/ d/
    sending incremental file list
    ./
    b/
    b/a/
1835.关于 awk 的 block 缓存问题:
    iostat 1|awk '{print $1;fflush()}' >a
    grep也有,--line-buffered可以按行来缓冲,而不是按block来缓冲,
    这样可以马上看到结果,但是数据量大的时候性能会很差,例如:
    while sleep .5;do echo $((i++));done|grep .|cat
1836.在指定时间执行 top 批处理模式获取系统状态信息:
    at -f <(TERM=linux top -b -n 1 >/tmp/top-report.txt) now+1minutes
    top -p 4360,4358    # 监控指定进程
    top -U johndoe        # ‘U’为 真实/有效/保存/文件系统用户名。
    top -u 500            # ‘u’为有效用户标识
    Top 遍历 /proc 文件夹,以收集进程信息:strace -o /tmp/trace.txt top -b -n 1
1837.在当前文件夹下启动一个内置的 php webServer,类似 python -mSimpleHTTPServer,PHP 5.4.0+
    php -S 127.0.0.1 8080 -t /dir
1838.杀死登录用户的所有进程:
    pkill -u abc    # -t pts/n 终端
    -u 是effective user ID,-U 是real user ID
    pkill python -t pts/1 
    注意 pkill 一般要加 -x,否则它会模糊匹配,比如 pkill mysql,它会把 mysqld 也干掉了。
1839.sed c\ 命令替换问题:
    sed '/AA/{c\CC}' example.txt    # sed: -e 表达式 #1, 字符 0: 未匹配的“{”
    解决方法有2个:
    1.分成两行写:c\换行CC换行}
    2.使用-e参数:sed -e '/AA/{c\CC' -e '}' 
    如果你把它写成一行,c命令会把后面的内容都当成要替换的内容,包括大括号,所以会报错。
1840.linux下ps -fe和ps aux都是截断,除非加-w,
    我屏幕宽度157个字符,就是157截断,除非-ww,这样才是完整的 
    13:19:50#tp#~> echo $COLUMNS
    157
    13:19:53#tp#~> ps -fe|wc -L
    157
    13:19:58#tp#~> ps -few|wc -L
    157
    13:20:00#tp#~> ps -feww|wc -L
    768
    13:20:02#tp#~>
1841.readlink 获取脚本当前的绝对执行路径:
    readlink /proc/7686/fd/255
1842.uniq 去重跳过 n 个字符/字段的用法:
    echo "hi Linux
    hi LinuxU
    hi LinuxUnix
    hi Unix"|uniq -c -w 8        # -w 只比较前 n 个字符
    3 hi Linux
    1 hi Unix
    
    echo "aabb
    xxbb
    bbc
    bbd"|uniq -D -s 2         # -s 不比较前 n 个字符
    aabb
    xxbb
    
    echo "hi hello Linux
    hi friend Linux
    hi hello LinuxUnix"|uniq -D -f 2         # -f 不比较前 n 个字段,-d 打印重复行一次,-D 打印所有重复行
    hi hello Linux
    hi friend Linux
1843.bash解析命令行参数,一般用 getopt 或者 getopts,getopts内置,但是不支持长参数 
1844.关于 ps -ef|grep [s]sh 可以排除自身的解释:
    1、管道是异步执行的:在执行ps的时候, grep也已经被执行, 不存在ps先执行后再把结果管道给grep的说法.
        因此 ps -ef|grep ssh 可能会有两条/一条结果(ssh进程存在的情况下)
    2、其次在PS的结果中, grep行是 [s]sh, 而grep过滤的内容是ssh, 所以就不会命中grep自己.
1845.rsync 的几个同步问题:
    最好别加 -u :否则如果回滚的话,不会同步,比如今天发了一个文件,结果有问题,回滚到昨天,用rsync,他不会更新远程的文件
                    因为那个文件没目的地的新,所以因为-u参数,跳过,不会同步
    rsync 比较文件,决定需要传输,默认采用 quick check 模式(size+timestamp),而不是 checksum,这样省 IO
    timestamp 可以通过 --modify-window 修改,防止两端的时间差带来的影响
    -I, --ignore-times,是关闭 quick check 条件,每次全量同步,而不是增量同步,这样 rsync 没有优势,不如 scp,可以省掉 服务端 IO
    --size-only、-c, --checksum 都是修改 quick check 条件,前者仅检查大小,后者用 MD5 校验和判断文件是否变化
    可以服务端禁掉一些浪费 IO 的选项:/usr/share/doc/rsync/examples/rsyncd.conf
    refuse options = checksum dry-run   # debian的rsync默认配置 
1846.nc 的妙用:
    nc 远程传输文件:
    nc -lp 1235 <a.log        # centos的话要注意,用-l,不是-lp,然后和redhat、debian、官方,参数都不一样 
    nc 1.1.1.1 1235 >a.log 
    nc -l -p 3003 -e /bin/bash
    nc 中一行 Bash 脚本创建并启动 Web Server:# 不过还是 pythom -m SimpleHTTPServer 好用
    while true; do { echo -e 'HTTP/1.1 200 OK\r\n'; cat index.html; } | nc -l 8080; done
    netcat可以一行模拟远程bash服务:
    netcat -lp 8888 -e /bin/bash
1847.wget 全站下载/抓取:
    wget -mp -nv 可以模拟一部分,不过css和js里面调用的不行。 
    还有域名白名单用-D指定 ,否则只抓当前域名的 
    curl -sLO http://product.yesky.com/mobilephone/list[1-347].html
    加个-L,list1的时候有跳转
1848.read 读入两个变量:
    echo "a b"|(read x y;echo $x;echo $y)    # read x y <<<"a b"
1849.ps 找出命令的启动时间:
    ps -eo pid,lstart,cmd
1850.利用 kill 处理 cpu 温度过高的进程:
    面对 cpu 负载过高导致温度过高的情况,直接把top里面cpu使用率最高的kill -19,然后再 kill -18 回来
    18) SIGCONT     19) SIGSTOP     20) SIGTSTP
    18是继续,后面两个都是暂停,其实CTRL-Z就是19或者20信号,具体可以自己trap以下,CTRL+C是2信号 
    19 和 20 的差异,请见 man 7 signal 
1851.date 里面时间的 + - 注意格式会影响结果/时区(最安全的写法是不要带符号,用自然语言即可):
    date -d'2013-07-01 09:52:33 +1 minutes'        # 这个+1被当成时区了 
    Mon, Jul 01, 2013  4:53:33 PM
    
    date -d'2013-07-01 09:52:33 1 minutes'         # 同样 -1 也会有问题
    Mon, Jul 01, 2013  9:53:33 AM
    
    date -u --date='+2 minutes 13-07-01 09:52:33'    # 把 + - 时间放在最前面也行
    Mon Jul  1 09:54:33 UTC 2013
    
    date -u --date='13-07-01 09:52:33 +0 +2 minutes'    # 注意前面的 -u UTC时间,少了也会有问题
    Mon Jul  1 09:54:33 UTC 2013
    
    date -u --date='13-07-01 09:52:33 GMT +2 minutes'    # 指定时区
    Mon Jul  1 09:54:33 UTC 2013
1852.gsub 去除单引号分割字符串:
     echo "1,2,3,'e,f,g','a,b,c',2,"|awk -F"'" '{for(i=1;i<=NF;i+=2)gsub(","," ",$i)}1'
1853.shell 编码规范:注意 [[ "x"$var == "x" ]], "x" 要放在前面,防止 -x 的出现
1854.巧用行号实现行内去重:
    echo "a b c a
    b c b"|awk '{for(i=1;i<=NF;i++){if(last[$i]!=NR)a[$i]++;last[$i]=NR}}END{for(i in a)print i,a[i]}'
1855.流量监控的话我觉得还是用iptables好,每天 iptables -vL 记录流量,然后 iptables -Z 清空
    把端口和ip写在iptables的acl里面就, 可以按端口和ip监控,还可以指定协议或者连接状态 
1856.平滑的切分 nginx 日志:
    mv  tracklog.ooxx.com.access.log ${log_date_dir}/tracklog.ooxx.com.access.log.${log_name_date}
    kill -USR1 `cat /var/run/nginx.pid`
    mv xx.log date.xx.log,nginx会去写date.xx.log,你reload,就写xx.log了,fd没释放,进程会占用这个文件继续写
    如果 mv 后没有 reload 就会有问题
    user1 reopen,这个信号应该是nginx自己的,他的程序里边应该会捕获这个信号
    reload 是把子进程重启了
1857.tree -d 打印目录:
    tree -d|awk '{if(/-- 2013/){if(f==0)print;f=1}else{f=0;print}}'
1858.top -p 监视单个进程:
    top -p $(pgrep -d, nginx)
1859.tail -F 根据文件名而不是文件描述符 FD 来监视文件:
    比如 vim 编辑文件 FD/inode 会变化:vim 默认类似 sed 不是 inplace,lsof|grep test.txt 可以看到源文件被 deleted 了
    此时 tail -f 追踪不到变化了,当然如果你 vim 中 se nowb(writebackup)的话不会改变 inode,vi -u NONE -N 也不会
1860.关于 .bashrc 环境变量在非登陆shell(nologin)环境下无法使用的问题:
    crontab 那种非登陆shell用不了 .bashrc 里的设置,需要 export,然后 source 让环境变量重新加载。
    .profile 也一样
1861.正反进程替换的用法:
    iconv -f utf-8 -t gbk < <(echo 中国) > >(xxd)
    上面这个和 echo 中国|iconv -f utf-8 -t gbk|xxd一样的 
    其实 <() 、<() 都是管道,<() 用在比如这个命令里面的变量你后面还要用到的时候
1862.sort 排序字符串中的数字:
    echo "aa2
    aa1
    aa13
    aa12"|sort -k1.3 -n
    -k1.3 相当于 -k1.3 -k1.9 排序指定字段中的指定范围的字符串,如果是文件名的话,还可以 ls -v 按版本号排序
1863.sort -m 中的归并排序 MergeSort,注意归并排序需要你参与归并的文件先有序:
    21:15:44#tp#~> seq 1 2 999999 >b
    21:15:49#tp#~> seq 0 2 999999 >a
    21:15:52#tp#~> time sort -m a b >/dev/null
    real    0m0.287s
    user    0m0.268s
    sys     0m0.016s
    21:15:55#tp#~> time cat a b|sort >/dev/null
    real    0m3.873s
    user    0m3.824s
    sys     0m0.040s
    21:16:05#tp#~> 
1864.du -b:-b是用字节数,然后显示真实使用了多少,而不是占用了多少。试着比较 du -B1 
1865.关闭 centos 的 ipv6 功能:
    vi /etc/sysconfig/network    添加
    NETWORKING_IPV6=no
    IPV6INIT=no
    vi /etc/modprobe.conf    添加
    alias net-pf-10 off
    alias ipv6 off
1866.关闭 centos 的 iptables 防火墙:
    /etc/init.d/iptables status
    /etc/init.d/iptables stop
    永久关闭:
    chkconfig --level 35 iptables off
    或者 直接 iptables -F 删掉所有规则
    也可以直接修改
    /etc/sysconfig/iptables
    添加一条
    -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
    #/sbin/iptables -I INPUT -p tcp –dport 80 -j ACCEPT
    #/sbin/iptables -I INPUT -p tcp –dport 22 -j ACCEPT
    #/etc/rc.d/init.d/iptables save
1867.curl 获取 request、response 请求头信息:
    curl -svo /dev/null http://www.hao123.com/ # curl -I 获取的是响应头信息
1868.bash 获取当前正在执行脚本的绝对路径:
    echo "scriptPath1: "$(cd `dirname $0`; pwd)
    echo "scriptPath2: "$(dirname $(readlink -f $0))
1869.进程代换的本质:
    其实进程替换相当于用fd来替代一个文件
    11:23:11#tp#~> echo <(pwd)
    /dev/fd/63
    11:26:37#tp#~> 
    pwd执行结果在/dev/fd/63里面,然后你可以用cat /dev/fd/63这样的方式实现和cat a一样的操作。
1870.date 获取指定日期对应一年中的周序号和一周中的日序号
    man date | grep '%[UVWw]'
       %G     year of ISO week number (see %V); normally useful only with %V
       %U     week number of year, with Sunday as first day of week (00..53)
       %V     ISO week number, with Monday as first day of week (01..53)
       %w     day of week (0..6); 0 is Sunday
       %W     week number of year, with Monday as first day of week (00..53)
    seq 1 10 | xargs -i date -d "2012-1-{} 0:0:1" +"%V,%U,%W,%w"
1871.巧用 shell/awk 解决算术题:
    学习 X 学 == 好好好
    seq 10 99 | awk '{print $1, $1*substr($1,1,1)}' | grep -P ' (\d)\1\1'
1872.find 命令顺序与逻辑关系带来的高危操作:
    find . -delete -name *.pyc         
    -delete 和 后面的 -name 是 and 的关系,而且最好 *.pyc 带上双引号,防止shell扩展后带来的空格问题
1873.kill -9
    kill -9 1 会重启
    一般-9杀不掉就两种,一个进程状态是D,磁盘io卡住了,一个是Z,已经是僵尸了,没法死了。
    其实僵尸只是死亡的一个中间过程,每个进程结束的时候都会经历,不过一般很快,你根本看不到。
1874.linux 下查看线程运行在哪个 CPU 上:
    ps -eo ruser,pid,ppid,lwp,psr,args -L|grep mysql-proxy
    查看线程:
    ps -eLf|grep mysql-proxy    # ps axms,ps aux,pstree -p pid,top -Hp pid,cat /proc/pid/status
    其中:
    LWP -- 轻量级进程,即线程,这里显示的是 thread id。 
    NLWP -- 线程数,即 number of threads in process。 
1875.time 时间含义:
    real:代表实际花费的时间
    user::代表cpu花费在内核外的时间
    sys:代表cpu花费在内核以内的时间
    通过把sys和user时间加起来可以获得cpu在你的程序上花费的时间。
    如果sys和user加起来的时间比real时间要小很多,那么你可以猜想你的程序的大部分性能瓶颈应该是IO等待的问题。
    Note that this is across all CPUs, so if the process has multiple threads it could potentially 
    exceed the wall clock time reported by Real. 所以多核多线程有可能 real < user + sys
1876.LC_ALL=C 的含义:
    Linux中有关locale的设置会影响大量的命令行工具,其中包括排序工具。
    多数安装的Linux系统都将LANG或者其他的locale默认设置成US English。
    但这可能会导致排序及其他命令慢上好几倍。
    因此export LCALL=C能避免使用i18n形式处理数据,带来性能提升。
1877.关于 test -n:[ -n ] 的问题:
    -n要带参数才是选项,否则相当于 [ "-n" ], 加了双引号就是 [ -n "" ]这个时候-n是参数了
    igi@macbook:~ $ [ ] && echo 'yes'
    igi@macbook:~ $ [ xxx ] && echo 'yes'
    yes
1878.关于 2>&1 和 2&>1 的含义:
    2>&1和2&>1都可以的,就是格式,其实&没意义,不一定在>后面。
    其实最好还是写&>,因为有&>>这种写法,但是>>&是不对的。
    >&和&>是一个组合,&不是和1或者2组合在一起的,2 >& 1 如果你携程2 > &1会报错的,2后面的空格去掉。
1879.printf 与 awk/sed 位数补全、千分位分割符:
    printf "%18s\n" `echo 123456789.12 | sed '{:a;s/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/;ta}'`
    echo '123456789.12'|awk '{printf "%'"'"'18.2f\n",$0}'    # "%\04718.2f\n",printf 格式定义是:%'18.2f
    echo '123456789.12'|xargs -I@ printf "%'18.2f\n" @        # 其实 awk 调用的 printf 和 shell 下的用法一样
    更多用法请参见:http://hi.baidu.com/leejun_2005/item/9d91b7fe9c628259c8f3376d
1880.利用死循环进行 ssh -D 链路中断自动重连:
    链路可能会断,我直接 while :;do ssh -Dport ip;done 就好了,加了-f的话我还得去判断链路是否断了,麻烦
    ssh 远端会 block 住,while 不会退出,等链接断了才重新循环,否则用了-f的话我还要while sleep 1;do ps -fe|grep ssh去判断 
1881.shell 下的文件锁:
    14:47:30#tp#~> flock abc sleep 9999 &
    [1] 16231
    14:47:40#tp#~> flock abc echo abc
    ^C  #这里因为上一条语句锁了abc文件,所以需要等待上面语句执行完成,释放锁,才能执行echo命令
    14:47:45#tp#~> flock def echo abc
    abc #换个文件就可以执行
    14:47:50#tp#~> 
1882.禁用使用 root 账号,用 sudo 控制权限
    Cmnd_Alias NP = /bin/netstat,/usr/bin/lsof,/home/bin/lsof.sh,/usr/bin/atop
    walkerxk        ALL=(ALL) PASSWD:ALL,NOPASSWD:NP
    这些命令/脚本不用密码,其他要密码 
1883.tc(TrafficControl) 限制网络速度,模拟网络延时:
    限制 100ms 的网络延时,其中 lo 是网卡的名称, 本地调试:
    sudo tc qdisc add dev lo root netem delay 100ms
    sudo tc qdisc del dev lo root netem delay 100ms
    http://stackoverflow.com/questions/614795/simulate-delayed-and-dropped-packets-on-linux/615757#615757
    也可以 iptables:
    iptables -A INPUT -m statistic --mode random --probability 0.01 -j DROP
    Be careful, anything above about 0.14 and most of you tcp connections will most likely stall completely.
1884.正在运行的程序转到后台运行:
    对于长时间运行的程序可以使用 screen、nohup、setsid 来避免被中断,
    如果对于已经运行,但是开始忘记使用screen、nohup、setsid的程序,可以使用disown命令,真是犀利的小工具,
    使用方法:ctrl+z,jobs,bg %jobid,disown -h %jobid。
    如果ctrl+z 无效,可以用 kill -20 $pid
1885.杀不掉的僵尸(zombie)进程:
    Linux的进程,有以下几种状态:
    D    Uninterruptible sleep (usually IO)
    R    Running or runnable (on run queue)
    S    Interruptible sleep (waiting for an event to complete)
    T    Stopped, either by a job control signal or because it is being traced.
    W    Paging (not valid since the 2.6.xx kernel)
    X    Dead (should never be seen)
    Z    Defunct ("zombie") process, terminated but not reaped by its parent.
    当一个进程处于Z状态,我们称之为zombie进程,正常情况下,处于zombie状态的进程,会很快地被它的父进程回收,
    以致于我们根本不会注意到zombie进程的存在。可在实践过程中,却有一些无法使用kill -9命令杀掉的zombie进程,
    如果某个进程一直处于zombie状态,可能会带来一些严重的问题,例如,假设这个进程没有正确地close掉socket,
    就会导致这些socket处于close_wait状态,这些socket将会占用系统的ip/port资源,将导致其他程序无法创建特定socket。
    当出现「杀不掉」的zombie进程,我们常常归咎于kernel的bug,不了了之,但其实还有一种情况常常被忽略。
    让我们看看上面的这个zombie进程内部,是否还有其他线程(使用top命令的-H参数):
    top -b -H -p pid
    如果有线程处于D(Uninterruptible sleep)状态,然而D状态的进程(在Linux中,线程只是特殊的进程)无法被中断,
    因此kill -9无法杀掉D状态的进程。也正因为这些D状态的进程的存在,导致父进程无法顺利的回收它们。
    我们还需要分析处于D状态的进程卡在了哪里。可通过/proc文件系统查看D状态进程的调用栈:
    #cat /proc/56337/stack
    [<ffffffff811b372e>] __blockdev_direct_IO_newtrunc+0x6fe/0xb90
    [<ffffffff811b3c1e>] __blockdev_direct_IO+0x5e/0xd0
    [<ffffffff811b1317>] blkdev_direct_IO+0x57/0x60
    [<ffffffff81113543>] generic_file_aio_read+0x793/0x870
    [<ffffffff81177c3a>] do_sync_read+0xfa/0x140
    [<ffffffff81178635>] vfs_read+0xb5/0x1a0
    [<ffffffff81178962>] sys_pread64+0x82/0xa0
    [<ffffffff8100b0f2>] system_call_fastpath+0x16/0x1b
    [<ffffffffffffffff>] 0xffffffffffffffff
    由上图可见,该进程卡在了磁盘的read操作中,很可能是磁盘坏了。
1886.bash 命令路径的 hash 缓存:真实的文件已经卸载,但是命令执行路径还是老的路径:
    如果某个命令被缓存,可以:command -V、type、hash -t 看出来
    hash -l 命令可以查看当前所有缓存的命令路径
    可通过如下命令之一清除缓存:
    hash -r
    hash -d python2.7
1887.find 的一些用法:
    (1)相反匹配:find -maxdepth 1 -not -iname "MyCProgram.c"
    (2)使用inode编号查找文件:find -inum 16187430 -exec mv {} new-test-file-name \;
        当文件名中含有特殊字符或者乱码时,可以考虑 inode 方式删除:ls -i1;find -inum 804180 -exec rm {} \;
    (3)根据文件权限查找文件:find . -perm -g=r -type f -exec ls -l {} \;
        使用八进制权限形式:find . -perm 040 -type f -exec ls -l {} \;
    (4)当前目录下的非隐藏空文件:find . -maxdepth 1 -empty -not -name ".*"
    (5)find -newer、-size
1888.printf 生成从 a 到 z 的字母表,字母之间不包含空格
    printf "%c" {a..z};printf "%c" {a..z} $'\n'
    如果想要快速地将 printf 的结果保存到变量中,可以使用-v选项:
    printf -v varStr "%c" {a..z}
1889.利用变量扩展重复输出 10 次字符串
    echo foo{,,,,,,,,,,}
1890.利用 fold 限制每行多少字符:
    fold -w10 urfile |xargs -n6 |awk '{print (NR-1)*60+1,$0}'
1891.sort 使用 tab 键作为分隔符,出现“sort: multi-character tab”错误:
    因为 sort -t 是不支持多个字符做分隔符的,你可以用另一种方式转义:
    -t$'\t'        # $'\t'是单个字符
    当然了,你也可以使用 Ctrl+v+TAB/I    # 先按 ctrl-v,再按 tab,这个组合和其它组合不一样
1892.telnet 日志重定向的问题:
    直接 telnet ip port <<EOF 会立即被 close 掉,nc 也不行,
    因为 telnet 的执行是非阻塞的,执行完了就退出 不管中间的过程,和 ssh 不一样
    { sleep 3; echo cmd; sleep 30; } |telnet 
    第一个 sleep 防止 telnet 因为网络原因导致登录还未成功就执行后面的命令,进而导致整个失败
    第二个相当于你的超时时间,超过30s 这次telnet会话就断掉,后面的sleep 其实是为了给日志回传一些时间
1893.注意 sort 按字段排序对后续字段的影响:
    sort -k1,1d -k2n 20131023.txt|head    
    # 注意sort -k1,1d 按字典序(默认)后断开,然后 -k2n 按数字排序,否则 sort -k1 -k2n 会全局按字典排序
1894.su 与 sudo 的作用区别:
    su 用来切换用户帐号
    sudo 是用其他用户的权限来运行程序,而无需知道那个帐号的密码,这是在 sudoers 文件里配置的,如果给ALL就相当于root了。
1895.awk 中正则不区分大小写:IGNORECASE
    如果 IGNORECASE 非零,那么 正则、FS、RS、RE ~、!~、gensub()、gsub()、index()、match()、split()、sub()
    以及所有 built-in functions 在正则操作时都将忽略大小写
    注意:数组下标不受此影响,但是 asort() 和 asorti() 是受影响的。
    例如 /aB/ matches all of the strings "ab", "aB", "Ab", and "AB"
1896.read -r 不转义反斜杠:遇到 \ 作普通字符解释
1897.crontab 编辑文件的路径:
    crontab -u userName -e     #编辑指定用户的文件
    crontab -e     #其实编辑的是 /var/spool/cron 下面对应 username 的文件
    crontab     #操作、调度日志放在 /var/log/cron
1898.parallel 利用多核CPU来加速你的Linux命令:
    它让我们所有的CPU内核在单机内做神奇的map-reduce操作,当然,
    这还要借助很少用到的–pipes 参数(也叫做–spreadstdin)。这样,你的负载就会平均分配到各CPU上。
    当然,这只对 CPU 密集型的计算有效,对 IO 密集型瓶颈在磁盘了。
    cat rands20M.txt | parallel --pipe awk \'{s+=\$1} END {print s}\' | awk '{s+=$1} END {print s}'
    cat bigfile.txt | parallel --block 10M --pipe grep 'pattern'    # –block 10M参数,这是说每个内核处理1千万行
    cat bigfile.bin | parallel --pipe --recend '' -k bzip2 --best > compressedfile.bz2
1899.查看 linux 系统安装时间:
    ls -lct --full-time /etc/ | tail -1 | awk '{print $6, $7, $8}'
1900.kill 让命令暂停与重新运行:
    #暂停指定的进程
    pid=`ps -ef|grep exp|grep -v grep|awk '{print $2}' `
    kill -19 "$pid"        
    #等待2小时
    sleep 7200
    #运行被暂停的进程
    kill -18 "$pid"        
    注意: 19) SIGTSTP、18) SIGCONT    每个系统kill含义不一样,具体 kill -l

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Python攻城狮

Python网络爬虫(五)- Requests和Beautiful Soup1.简介2.安装3.基本请求方式5.程序中的使用4.BeautifulSoup4

Requests 是用Python语言编写,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库。它比 urllib 更加方便,...

1294
来自专栏码洞

RPC 服务器之【多进程描述符传递】高阶模型

今天老师要给大家介绍一个比较特别的 RPC 服务器模型,这个模型不同于 Nginx、不同于 Redis、不同于 Apache、不同于 Tornado、不同于 N...

1282
来自专栏Rovo89

Unix/Linux常用的命令

1915
来自专栏零基础使用Django2.0.1打造在线教育网站

零基础使用Django2.0.1打造在线教育网站(十四):用户密码找回

努力与运动兼备~~~有任何问题可以加我好友或者关注微信公众号,欢迎交流,我们一起进步!

3041
来自专栏PhpZendo

PHP 文件系统完全指南

今天我们将开启一个新的探索旅程,深入到 PHP 文件系统中,系统的学习和掌握 PHP 文件系统的基本使用。

1733
来自专栏Android工程师的修仙之旅

bat批处理简介:Windows自动化之道

最近在工作中遇到一些纯粹重复的工作,最终都通过脚本方式达到了自动化,大大提高效率。比如之前每次发布zip包都需要手动编译lua文件、替换lua引用为二进制文件的...

2832
来自专栏从零开始学自动化测试

Selenium+python自动化21-TXT数据参数化

前言 在17篇我们讲了excel数据的参数化,有人问了txt数据的参数化该怎么办呢,下面小编为你带你txt数据参数化的讲解 一、以百度搜索为例,自动搜索五次不...

3245
来自专栏飞雪无情的博客

Go语言实战笔记(十六)| Go 并发示例-Pool

这篇文章演示使用有缓冲的通道实现一个资源池,这个资源池可以管理在任意多个goroutine之间共享的资源,比如网络连接、数据库连接等,我们在数据库操作的时候,比...

1122
来自专栏计算机编程

ionic4 -- angular 跳转页面

ionic4 与前辈们最大的不同就是通过angular引入了route,这样每次跳转的时候只需要直接跳转对应的路由地址就可以了,给了路由器上的解耦,也解决了原来...

9482
来自专栏salesforce零基础学习

salesforce lightning零基础学习(六)Lightning Data Service(LDS)

本篇可参看:https://trailhead.salesforce.com/modules/lightning_data_service

1593

扫码关注云+社区

领取腾讯云代金券