单进程命令行生存指南
有时服务器配置错误(进程数限制),导致ssh无法登陆 shell request failed on channel 0
好不容易登上服务器了,bash也提示fork失败,即:无法派生子进程
那么,怎么样在不派生子进程的情况下完成一些基本的管理操作呢?(其实找到几个进程,kill掉,问题就解决了)(但作为shell的进阶练习也不错)
查看当前用户的进程:
$ for i in /proc/[0-9]*;do cd $i 2>/dev/null; [ $? -ne 0 ] ||read -d '' line <status;[[ "$line" =~ Uid:[[:space:]]*1000 ]]&&c=$(pwd)&&echo ${c##/proc/};cd /proc;done
注意事项:
1. 记得修改uid(命令里是1000)
bash读取整个文件 ( -d '' ) 。 -d '' 表示 没有分隔符 -> 一直读到文件结束
$ read -d '' filecntnt <file
注意事项:
1. -d '' :-d 和 '' 之间要有空格分隔
2. 此时read返回1
3. 可用set命令查看变量filecntnt的内容。如果 filecntnt包含非ascii字符,非ascii字符会用八进制表示 (类似于\344\233), 同时set输出的变量的内容会包裹在$''中
$ set ... a=$'message \333\344 ..' ...
输出刚才读取的文件的内容
$ echo -n "$filecntnt"
注意事项:
1. 变量要包裹在双引号里,否则会进行词拆分(word spliting),输出结果受IFS影响
简单grep (何止简单,简直naive)
$ while read line;do [[ "$line" =~ '10.0' ]] && echo -e "$line";done <index.html
使用了match的 =~ 操作 :[[ str =~ pattern ]]
注意事项:
1. pattern是可以包括在引号中的,包括在引号中时,当做纯文本,而非正则表达式?
pattern包含空白字符,同时想要当做正则表达式(不引在双引号里),怎么写:
[[ "$line" =~ Uid:[[:blank:]]*1000 ]]
[[ "$line" =~ Uid: 1001 ]] #简单的输入空白字符,会报语法错误
统计字符串中单词数量
$ str='apple banana watermelon .....' $ a=($str) $ echo ${#a[@]}
同样的方法,可以看当前目录中文件的数量(包含目录,不包含. ..)
$ a=(*) $ echo ${#a[@]}
注意事项:
1. a=*;b=($a);echo ${#b} 同样能输出 文件的数量,但是注意 变量a的值是 ’*‘,而非 'filename1 filename2 ...' :变量赋值不进行文件名展开
稍微改一下就能统计当前进程数
$ cd /proc $ a=([0-9]*) $ echo ${#a[@]}
待续....