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.167https://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 -alsb_release -a(是ls /etc/*release的结果之一)cat /etc/os-release其中,“NAME”表示发行版名称,“VERSION”表示版本号和代码名称。cat /proc/versiongetconf 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
- 符号链接(软链接):ln –s src dest, eg
- 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 >> file0awk '/^$/{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.txtsort -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
hostname2 3 (截取hostname字符串,从第二个字符开始,截3位,若hostname的值是h101,则该命令执行结果为101) - 字符串截取
var=h101 echo ${var:1} echo ${var:0:1}
工具
scp
查看指定进程有多少个(如下是查看java进程有多少个)
ps axu | grep java | wc -lnetcat nc https://blog.csdn.net/fageweiketang/article/details/82833193
z-modem文件传输
sudo yum install -y lrzszftp
wet https://download-ib01.fedoraproject.org/pub/epel/7/x86_64/Packages/n/ncftp-3.2.5-7.el7.x86_64.rpm && sudo rpm -Uvh ncftp-3.2.5-7.el7.x86_64.rpm
sed
https://michael728.github.io/2020/02/18/linux-command-sed/
遇到的问题
- 问题:tomcat启动不了 熵
- 解决:
yum install rng-toolssystemctl 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 更新时间:2025-09-19 10:08