单进程命令行生存指南

有时服务器配置错误(进程数限制),导致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[@]}

  

 


 

待续....

posted @ 2020-11-03 18:24  drelo  阅读(133)  评论(0编辑  收藏  举报