linux shell

网络

(sudo yum install -y firewalld)

  • lsof -i:80 查看占用80端口的程序 (yum install -y lsof)
  • 检查端口被哪个进程占用 netstat -lnp|grep 8000 (需要yum install net-tools -y)
  • /etc/init.d/iptables status
  • /etc/init.d/iptables stop
  • 开启端口 firewall-cmd --zone=public --add-port=80/tcp --permanent
  • 查看已经开放的端口 firewall-cmd --list-ports
  • 重启firewall firewall-cmd --reload
  • 停止firewall systemctl stop firewalld.service
  • 禁止firewall开机启动 systemctl disable firewalld.service
  • 开机自启动 systemctl enable firewalld.service
  • 查看防火墙状态 firewall-cmd --state
  • tcpdump -i eth0 -v -c 10 tcp port ! 22 and host 115.183.5.167 https://linux.cn/article-10191-1.html
  • 查看系统日志信息 cat /var/log/messages
  • 查看当前服务器请求数 netstat -na | wc -l

while true;do curl http://192.168.56.11:30080/;sleep 1;done

  • 同步时间 ntpdate ntp3.aliyun.com
  • 修改时区 timedatectl set-timezone Asia/Shanghai

bash相关

.bash_history :记录了您以前输入的命令,
.bash_logout :当您退出 shell 时,要执行的命令,
.bash_profile :当您登入 shell 时,要执行的命令,
.bashrc :每次打开新的 shell 时,要执行的命令

is_byebye_set=`cat ~/.bash_logout | grep "bye bye"`
if [ "" == "${is_byebye_set}" ]; then
cat >> ~/.bash_logout <<EOF
echo ===================
echo    bye bye 
echo ===================
EOF
else
echo "bye bye was set."
fi

$PS1, $PS2 变量来设置提示符,$PS2是当在多行内输入一个命令时,换行后,出现的提示符。命令

[root@launch201003 ~]# echo $PS1
[\u@\h \W]\$
[root@launch201003 ~]# echo $PS2
>

可用的PS1: PS1='\n[\e[1;32m\u\e[1;33m@\e[1;35m\H\e[0m \e[1;34m\W\e[0m]\n$'

is_ps1_set=`cat ~/.bashrc | grep "change PS1"`
if [ "" == "${is_ps1_set}" ]; then
cat >> ~/.bashrc <<EOF

# can use me to call the function me()
function me() {
    echo "I'm billy"
}
function wechat() {
    sh "/opt/workbench/upload/pyt/_login_and_work.sh"
}

function gitpl() {
    sh "/opt/workbench/git-repo/__git_pull.sh"
}

# show git info
function __my_git_ps1() {
  # 【坑】这里使用 -f "~/.git-prompt.sh"会返回false
  if [ -f ~/.git-prompt.sh ]; then
    chmod +x ~/.git-prompt.sh
    . ~/.git-prompt.sh
    # 【坑】要使用双引号
    echo "\`__git_ps1\`"
  else
    echo ""
  fi
}

# change PS1
# attention! text value in PS1 should use (') not (") 
PS1='\n[\e[1;32m\u\e[1;33m@\e[1;35m\H\e[0m \e[1;34m\W\e[0m]'
PS1="\$PS1"'\e[36m'       # change color to cyan
# 【坑】要使用单引号
PS1="\$PS1"'\`__my_git_ps1\`'   # bash function
PS1="\$PS1"'\e[0m'        # clear color
PS1="\$PS1"'\n'               # new line
PS1="\$PS1"'\$ '               # prompt: always $

export COLOR_RED='\e[1;31m'
export COLOR_GREEN='\e[1;32m'
export COLOR_YELOW='\e[1;33m'
export COLOR_BLUE='\e[1;34m'
export COLOR_PINK='\e[1;35m'
export COLOR_NONE='\e[0m'

echo -e " \${COLOR_PINK}===================\${COLOR_NONE}"
echo -e " \${COLOR_PINK}  welcome by .bashrc  \${COLOR_NONE}"
echo -e " \${COLOR_PINK}===================\${COLOR_NONE}"

EOF
else
echo "ps1 was set."
fi
source ~/.bashrc
echo "测试颜色,语法如下:"
echo '一:echo -e "\033[背景颜色;文字颜色m字符串\e[0m"'
echo '二:echo -e "\e[背景颜色;文字颜色m字符串\e[0m"'
echo -e "\033[41;36m content \033[0m"
echo -e "\e[41;36m content \e[0m"
echo -e "\e[30m 黑色字 \e[0m"
echo -e "\e[31m 红色字 \e[0m"  # 不正确
echo -e "\e[32m 绿色字 \e[0m"  # 不正确
echo -e "\e[33m 黄色字 \e[0m"
echo -e "\e[34m 蓝色字 \e[0m"
echo -e "\e[35m 紫色字 \e[0m"
echo -e "\e[36m 天蓝字 \e[0m"
echo -e "\e[37m 白色字 \e[0m"

echo -e "\e[40;37m 黑底白字 \e[0m"
echo -e "\e[41;37m 红底白字 \e[0m"
echo -e "\e[42;37m 绿底白字 \e[0m"
echo -e "\e[43;37m 黄底白字 \e[0m"
echo -e "\e[44;37m 蓝底白字 \e[0m"
echo -e "\e[45;37m 紫底白字 \e[0m"
echo -e "\e[46;37m 天蓝底白字 \e[0m"
echo -e "\e[47;30m 白底黑字 \e[0m"

\e[0m 关闭所有属性  【\e[m】和【\e[0m】相同
\e[1m 设置高亮 加粗
\e[4m 下划线
\e[5m 闪烁
\e[7m 反显
\e[8m 消隐
\e[30m — \33[37m 设置前景色
\e[40m — \33[47m 设置背景色
\e[nA 光标上移n行
\e[nB 光标下移n行
\e[nC 光标右移n行
\e[nD 光标左移n行
\e[y;xH设置光标位置
\e[2J 清屏
\e[K 清除从光标到行尾的内容
\e[s 保存光标位置
\e[u 恢复光标位置
\e[?25l 隐藏光标
\e[?25h 显示光标

性能

  • 查看内存 free -m
  • top
  • iostat -x 1
ps aux | grep dubbo
netstat -anp | grep 80
netstat -anp | grep 80 | grep LIS
ps -ef | grep fire
netstat -anp | grep 6379
docker images | grep registry/tomcat
netstat -anp | grep -i listen
docker rmi 192.168.0.113:5000/elasticsearch

系统信息相关

  • uname -a
  • lsb_release -a (是ls /etc/*release的结果之一)
  • cat /etc/os-release 其中,“NAME”表示发行版名称,“VERSION”表示版本号和代码名称。
  • cat /proc/version
  • getconf LONG_BIT 当前操作系统的位数

文件(夹)操作

  • 隐藏文件是以.开头的文件。
  • 切换目录 cd xxx
  • 查看当前目录的绝对路径 pwd
  • 查看文件 ls -Fpla (l -> long, a -> all)
  • 查看文件的访问时间 ls -l --time=atime abc
  • 创建一个新文件 touch abc
  • 复制 cp
  • 把下前目录下的所有文件夹的下.project文件删除
    find ./ -type f -name ".project" -print -exec rm -rf {} \;
  • 把下前目录下的所有文件夹的下target文件夹删除
    find ./ -type d -name "target" -print -exec rm -rf {} \;
  • 查询大于5M的文件 find / -type f -size +5000k
  • 把某文件夹下的多层文件夹里的所有jpg结尾的文件复制到另一文件夹下cp folder1/**/*.jpg folder2/
  • 查看文件inode编号(inode编号是内核分配给文件系统的每一个文件的唯一数字) ls -i abc
  • 链接(创建如下两种链接后可以查看文件的inode编号以确认链接和原文件是不是同一个文件)
    • 符号链接(软链接):ln –s src dest, eg ln -s /usr/local/bin/docker-compose /usr/local/bin/doco
    • 硬链接:ls src dest
  • vim中将s1替换为s2 :%s/s1/s2/g
  • git-bash中将所有java文件编码调整成UTF-8
    • find ./ -type f -name "*.java" | while read line; do iconv -t UTF-8 $line; done
    • 处理多类文件 find ./ -type f -name "*.java" -or -name "*.jsp" | while read line; do iconv -t UTF-8 $line; done
  • 当前时期/时间作为随机字符串
    • date "+%Y-%m-%d %H:%M:%S"
    • mkdir -p /tmp/abc/test-dir-date +"%Y%m%d__%H_%M_%S"
    • mv CMBCPayImpl.class CMBCPayImpl.class.$(date +%F)
  • echo 'Welcome to your Vagrant-built virtual machine.' > /etc/motd
  • echo "$JAVA_HOME" 会替换变量
    echo '$JAVA_HOME' 不替换变量
  • 查看文件行数 wc -l a.log
  • 查看文件中以两位数字开头的行 cat a10000.csv2 | egrep '^[0-9]{2,}'
  • 查看只有一列的文件中是否有重复数据 cat a10000.csv | sort | uniq -c
  • 查看只有一列的文件中只不重复数据的行 cat a10000.csv | sort | uniq -c | awk '{if ($1==1) print $0}'
  • 命令行方式文件上传 curl -F "file=@a.png" http://localhost:9002/file/upload.do
  • 查看CPU的情况 cat /proc/cpuinfo | grep "model name"
  • 查看cpu数量 cat /proc/cpuinfo | grep "model name" | wc -l
  • 把当前文件夹及子文件夹中的所有.html后缀改成.ftl
    find ./ -type f -name "*.html" | xargs -I file echo file | sed 's/\.html/\./g' | xargs -I fileWithoutExt mv fileWithoutExt'html' fileWithoutExt'ftl'
    
  • 把当前文件夹下的Controller.java改名为AppController.java
    find ./ -type f -name "*Controller.java" | xargs -I file echo file | sed 's/Controller\.java//g' | xargs -I fileWithoutExt mv fileWithoutExt'Controller.java' fileWithoutExt'AppController.java'
    
  • 把当前目录下的svg文件名前都添加icon-
    for file in *.svg; do mv "$file" "icon-${file}"; done
    
  • 将m4a文件转成ogg
    ffmpeg -i Battle2.m4a -acodec libvorbis Battle2.ogg
    
  • 将本文件夹中的所有m4a文件转成ogg
    find ./ -type f -name "*.m4a" | xargs -I file echo file | sed 's/\.m4a/\./g' | xargs -I fileWithoutExt  ffmpeg -i fileWithoutExt'm4a' -acodec libvorbis fileWithoutExt'ogg'
    

grep配合wc命令统计在文件中出现的行数
grep -o "costMillis" a.log | wc -l

  • 打印通过空格隔开的每一行的第4个和第6个字符
    awk '{print $4,$6}' application.log
  • 打印通过“:”隔开的每一行的第4个和第6个字符
    awk -F: '{print $4,$6}' application.log
  • 给某文件的每行文件添加一个分号
    awk '{print $0";"}' a.txt > b.txt
  • 删除每行前几个字符(^.表示开头1个字符,n个.即表示n个字符)
    sed -i 's/^..//g' a.txt
  • 文件按从小到大排序取出前3个 ls -hlSr | head -n 4 (S: sort, r: reverse, 4: ls的输出有一行是无用信息)
  • 查看centOS版本 cat /etc/redhat-release

查询特定目录下面大于 200M 的文件
find /home/admin -size +200M

1天内访问过的文件
find /home/admin -atime -1

1天内修改过的文件
find /home/admin -mtime -1

1分钟内访问过的文件
find /home/admin -amin -1

1分钟内修改过的文件
find /home/admin -mmin -1

删除创建时间是7天前的文件?
find /root/workbench_dir/backup/ -type f -mtime +7 -exec rm -rf {} ;

定时任务
crontab -l
crontab -e
每五分钟执行一次
*/5 * * * * sh /root/secure_ssh.sh
每天2点执行一次
0 2 * * * sh /root/dockers/mysql57/backup_mysql.sh

防止暴力破解centos的登录密码
cat secure_ssh.sh

#!/bin/bash
cat /var/log/secure|awk '/Failed/{print $(NF-3)}'|sort|uniq -c|awk '{print $2"="$1;}' > /usr/local/bin/black.txt
for i in `cat  /usr/local/bin/black.txt`
do
  IP=`echo $i |awk -F= '{print $1}'`
  NUM=`echo $i|awk -F= '{print $2}'`
   if [ $NUM -gt 5 ];then
      grep $IP /etc/hosts.deny > /dev/null
    if [ $? -gt 0 ];then
      echo "sshd:$IP:deny" >> /etc/hosts.deny
    fi
  fi
done

压缩解压

  • 解压 tar zxvf 文件名.tar.gz 如 tar zxvf abc.tar.gz
  • 压缩 tar zcvf 文件名.tar.gz 文件夹名 如 tar zcvf abc.tar.gz abc/
  • 压缩目录 zip -r 目标文件名.zip 文件夹名 如 zip -r socket1.zip socket1/

使用7z

为什么使用7z?因为zip/tar压缩工具生成的压缩包很大,7z还支持分卷压缩(可能zip/tar也支持)。

安装:yum install p7zip p7zip-plugins -y

示例命令 7z a -mx0 -mhe=on -paaa -sas AC.7z AC.pdf

示例命令 7z a -t7z -mx0 -mhe=on -paaa -sas AC.7z AC.pdf

  • a 压缩
  • -t 压缩格式类型
  • -mx0 不压缩(仅存储) 操作起来特别快
  • -mhe=on 打开压缩包时看不到文件名
  • -p 设置密码
  • -sas 若目标压缩包的文件名中没有扩展名,就自动追加。
  • AC.7z 目标压缩包的文件名
  • AC.pdf 被压缩的文件列表

分卷压缩示例:7z a -t7z -v3m springboot-simple.jar.7z springboot-simple.jar
分卷压缩后删除原文件示例:7z a -t7z -v5m -sdel springboot-simple.jar.7z springboot-simple.jar

free命令结果

centos7中执行free -m如下

              total        used        free      shared  buff/cache   available
Mem:           7466        3659         294          22        3511        3437
Swap:             0           0           0

其中:

  • free 是真正尚未被使用的物理内存数量。
  • total = used + free + buff/cache
  • buff/cache与available的区别:
    • available 是应用程序认为可用内存数量,available = free + buffer + cache (注:只是大概的计算方法)
    • buff/cache是操作使用使用的,随着程序申请内存,操作系统会回收该部分内存

服务相关

  • systemctl -a 查看所有服务列表
  • systemctl -l 查看活动服务列表

安装openssh

先更新系统,再安装openssh,否则安装完可能无法启动。

sudo pacman -Syu
sudo pacman -S openssh
sudo systemctl start sshd.service
sudo systemctl enable sshd.service
sudo systemctl restart sshd.service

修改manjaro界面为英文
sudo vim /etc/locale.gen
确保只有en_US.UTF-8 UTF-8,且行首没有#
再执行sudo locale-gen,重启即可

manjaro 手动调节屏幕亮度(好像无效) https://zhuanlan.zhihu.com/p/138880080

修改hostname hostnamectl set-hostname nj201

shell

$n 获取脚本的参数列表

描述:n为数字,$0代表脚本名称,$1~$9代表第1到第9个参数,十以上的需要用大括号如${10},${11}

cat > a.sh <<EOF
#!/bin/bash
# filename a.sh
echo "\$0 \$1 \$2 \$3 \$4 \$5 \$6 \$7 \$8 \$9 \${10} \${11}"
EOF
chmod +x a.sh && ./a.sh p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11

$# 获取脚本的参数个数

cat > a.sh <<EOF
#!/bin/bash
# filename a.sh
echo "number of parameter: \$#"
EOF
chmod +x a.sh && ./a.sh p1 p2 p3 p4 p5

$* $@ 获取脚本的所有参数

$*:获取命令行中的所有参数,把所有参数当成一个整体
$@: 获取命令行中的所有参数,把所有参数分别对待

cat > a.sh <<EOF
#!/bin/bash
# filename a.sh
echo "situation 1: not in loop"
echo "\\\$*: \$*"
echo "\\\$@: \$@"

echo "situation 2: in loop"
echo "loop of \\\$*"
for N in "\$*"
do
   echo \$N
done
echo "loop of \\\$@"
for N in "\$@"
do
   echo \$N
done
EOF
chmod +x a.sh && ./a.sh p1 p2 p3 p4 p5

$? 获取上个命令的执行结果

$?: 结果是0就是执行正常,非0为错误

cat > a.sh <<EOF
#!/bin/bash
# filename a.sh
ls /
echo "\\\$?: \$?"
# a command that not exist
abc
echo "\$?: $?"
EOF
chmod +x a.sh && ./a.sh p1 p2 p3 p4 p5

read option
echo $option

TODO:
basename
dirname

cut:

cat > sample_cut.sh <<EOF
#!/bin/bash
echo "192.168.0.100" | cut -d . -f 1
echo "192.168.0.100" | cut -d . -f 2
echo "192.168.0.100" | cut -d . -f 3
echo "192.168.0.100" | cut -d . -f 4
EOF
chmod +x sample_cut.sh && ./sample_cut.sh

sed 流编辑器

替换
删除
追加

cat > sample_sed.sh <<EOF
echo a1 > tmp.txt
echo a2 >> tmp.txt
echo a3 >> tmp.txt
echo a4 >> tmp.txt
echo a5 >> tmp.txt
# 删除第2到4行
sed '2,4d' tmp.txt
# 删除第3到最后行
# sed '3,$d' tmp.txt
# 在第2行后面追加
# sed '2a drink tea' tmp.txt
# 仅显示第2~4行 -n 表示只打印匹配的行
# sed -n '2,4p' tmp.txt
# 找到包含a2内容的行,并删除
# sed -i '/a2/d' tmp.txt
# 数据的搜寻并替换
# sed 's/要被取代的字串/新的字串/g'
# 删除tmp第三行到末尾的数据,并把a替换为bbb
# sed -e '3,$d' -e 's/a/bbb/' tmp.txt
# 直接修改原文件,由于 $ 代表的是最后一行,而 a 的动作是新增,因此该文件最后新增『# This is a test』!
# sed -i '$a # This is a test' tmp.txt
EOF
chmod +x sample_sed.sh && ./sample_sed.sh

awk: 逐行读取文件,以空格作为默认分隔符将每行切片。
sort
定义函数,在调用函数之前先声明函数。

企业真实面试题:

  • 使用linux命令查看file0中空行所在的行号

    echo a1 > file0
    echo a2 >> file0
    echo a3 >> file0
    echo "">> file0
    echo a4 >> file0
    echo a5 >> file0
    

    awk '/^$/{print NR}' file0

  • 有文件score.txt内容如下:

    张三 40
    李四 30
    王五 50
    

    计算第二列的各并输出。

cat > score.txt <<EOF
张三 40
李四 30
王五 50
EOF

cat score.txt | awk -F " " '{sum+=$2} END{print sum}'

  • 用shell对文本中无序的一列数排序。
cat > num.txt <<EOF
4
5
3
2
1
EOF

sort -n num.txt
sort -n num.txt | awk '{a+=$0;print $0} END{print "SUM="a}'

  • 用shell脚本查找当前文件夹下所有的文本文件中包含字符串"sample"的文件名称
echo "not match" > not_match.txt
echo "i am sample1" > sample1.txt
echo "i am sample2" > sample2.txt

grep -r "sample" ./ | cut -d ":" -f 1

字符串操作

  • 替换
    abc=$(echo 'this is a test' | sed 's/this/This/g')
    echo $abc
    
  • 截取字符串,expr substr hostname 2 3 (截取hostname字符串,从第二个字符开始,截3位,若hostname的值是h101,则该命令执行结果为101)
  • 字符串截取
  • var=h101
    echo ${var:1}
    echo ${var:0:1}
    

工具

sed

https://michael728.github.io/2020/02/18/linux-command-sed/

遇到的问题

  • 问题:tomcat启动不了 熵
  • 解决:yum install rng-tools systemctl start rngd

nginx

  • 重启nginx ./nginx -s reload

区域调整:

locale
localectl status
sudo localectl set-locale LANG=en_US.utf8
sudo cat /etc/locale.conf

规范

linux 系统集群前准备

  • 配置用户billy/qwer1234

  • 配置目录 /opt/software /opt/module 且给billy配置权限 sudo chown billy:billy /opt/module

  • 配置sudoers sudo vim /etc/sudoers

    ## Allows people in group wheel to run all commands
    # %wheel        ALL=(ALL)       ALL
    billy   ALL=(ALL)       NOPASSWD: ALL
    
  • 配置静态ip sudov vim /etc/sysconfig/network-scripts/ifcfg-enp0s3 (需要修改的是ONBOOT,BOOTPROTO,IPADDR,NETMASK,GATEWAY)

    TYPE="Ethernet"
    PROXY_METHOD="none"
    BROWSER_ONLY="no"
    DEFROUTE="yes"
    IPV4_FAILURE_FATAL="no"
    IPV6INIT="yes"
    IPV6_AUTOCONF="yes"
    IPV6_DEFROUTE="yes"
    IPV6_FAILURE_FATAL="no"
    IPV6_ADDR_GEN_MODE="stable-privacy"
    NAME="enp0s3"
    UUID="9b168b3c-962f-48e5-ba24-827c3bf69485"
    DEVICE="enp0s3"
    PREFIX="24"
    IPV6_PRIVACY="no"
    ONBOOT="yes"
    BOOTPROTO="static"
    IPADDR="192.168.0.150"
    NETMASK="255.255.255.0"
    GATEWAY="192.168.0.1"
    
  • 配置 sudo vim /etc/resolv.conf (不需要配置8.8.8.8)

    # Generated by NetworkManager
    # 注意自己上面的ip
    nameserver 192.168.0.1
    #nameserver 8.8.8.8
    
  • 配置hosts文件 sudo vim /etc/hosts
    ```text

127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.0.150 h150
192.168.0.151 h151
192.168.0.152 h152
192.168.0.153 h153

- 配置 国内yum源 `sss` `sss2`
- 配置 hostname `sudo vim /etc/hostname`
- 安装相关软件
  * sudo yum install -y lrzsz firewalld vim rsync
  * sudo yum install -y xinetd telnet telnet-server (sudo chkconfig telnet on)
- 配置 xsync
- 配置 jdk
- 配置 maven
- (只需要一台机器)配置 docker,方便安装mysql

### 复制虚拟机
- 修改ip
- 修改hostname

### shell脚本片段

```shell
#!/bin/bash

SERVERS_AND_USER_AND_PASS="192.170.2.152,root,abc123 192.170.2.153,root,abc123 192.170.2.154,root,abc123"
for line in $SERVERS_AND_USER_AND_PASS
do
    _ip=$(echo "$line"|cut -f1 -d",")
  _user=$(echo "$line"|cut -f2 -d",")
  _pass=$(echo "$line"|cut -f3 -d",")
  echo "info is $_ip $_user $_pass"
done

使用命令行管理virtualBox

最近在鼓捣hadoop,装了几台虚拟机,,总感觉gui启动很别扭,后来发现virtualBox有个headless模式,只想说舒服!

常用命令
VBoxManage startvm name|id --type [gui|headless|svd] #启动
VBoxManage startvm name|id --type [gui|headless|svd] #启动
VBoxManage list runningvms # 列出运行中的虚拟机
VBoxManage controlvm XP acpipowerbutton # 关闭虚拟机,等价于点击系统关闭按钮,正常关机
VBoxManage controlvm XP poweroff # 关闭虚拟机,等价于直接关闭电源,非正常关机
VBoxManage controlvm XP pause # 暂停虚拟机的运行
VBoxManage controlvm XP resume # 恢复暂停的虚拟机
VBoxManage controlvm XP savestate # 保存当前虚拟机的运行状态

常用命令

ls cd lsblk
find、df、tar、ps、top、netstat等
1、查看内存:top free -m
2、查看磁盘存储情况:df -h
3、查看磁盘IO读写情况:iotop(需要安装一下:yum install iotop)、iotop -o(直接查看输出比较高的磁盘读写程序)
4、查看端口占用情况:netstat -tunlp | grep 端口号
5、查看进程:ps aux

conf jdk

cd ~
mkdir -p /opt/application
wget https://repo.huaweicloud.com/java/jdk/8u151-b12/jdk-8u151-linux-x64.tar.gz
cd /opt/application

if

if [ -f /data/filename ]; then
echo "文件存在"
else
echo "文件不存在"
fi

if [ ! -d "/data/" ];then
mkdir /data
else
echo "文件夹已经存在"
fi

-r file     用户可读为真
-w file     用户可写为真
-x file     用户可执行为真
-f file     文件为正规文件为真
-d file     文件为目录为真
-c file     文件为字符特殊文件为真
-b file     文件为块特殊文件为真
-s file     文件大小非0时为真
-t file     当文件描述符(默认为1)指定的设备为终端时为真

实际问题

如果CPU使用率达到100%呢?怎么排查?

  • 通过top找到占用率高的进程。
  • 通过top -Hp pid找到占用CPU高的线程ID。这里找到958的线程ID
  • 再把线程ID转化为16进制,printf "0x%x\n" 958,得到线程ID为0x3be
  • 通过命令jstack 163 | grep '0x3be' -C5 --color 或者 jstack 163|vim +/0x3be - 找到有问题的代码

设置服务自启动

vim /lib/systemd/system/frpc.service

[Unit]
Description=Frp Client Service
After=network.target

[Service]
Type=simple
User=nobody
Restart=on-failure
RestartSec=5s
ExecStart=/usr/bin/frpc -c /etc/frp/frpc.ini
ExecReload=/usr/bin/frpc reload -c /etc/frp/frpc.ini

[Install]
WantedBy=multi-user.target

sudo systemctl start frpc
sudo systemctl enable frpc

ExecStart中要使用/usr/bin和/etc/这样的目录,不要使用/root/application/...或/home/sample/...这样的路径,很容易会没有权限.

centos7下安装htop

# https://www.jianshu.com/p/5629e331f58d
yum -y install epel-release
# 安装过程中会有Network is unreachable,但最终会成功
yum -y install htop

nfs

服务器端

安装 & 配置

yum install -y nfs-utils
echo '/nfs_data *(rw,no_root_squash)' >> /etc/exports

sudo mkdir -p /nfs_data
service nfs restart
systemctl enable nfs

showmount -e

客户端

yum install -y nfs-utils

作者:admin  创建时间:2022-04-19 20:40
最后编辑:admin  更新时间:2025-09-19 10:08