linux相关
linux shell 脚本
############ 常用命令 ######
scp -r file_source file_target
#将文件夹本地拷贝到远程(本地到服务器、服务器之间同理可得)
scp -r /data1/jiangsa/scRNA-SP/ root@192.168.1:/data2/Sp
#将文件夹从远程服务器中拷贝到本地(本地到服务器、服务器之间同理可得)
scp -r root@192.168.1:/data2/Sp /data1/jiangsa/scRNA-SP/
#将命令放后台执行
nohup scp -r root@192.168.1:/data2/Sp /data1/jiangsa/scRNA-SP/
回车(Enter)
输入root用户密码-回车(Enter)
Ctrl+z #暂停挂起该进程
bg #继续运行该进程
jobs命令:提交到后台的命令可以通过jobs -l 进行查看
第一列:任务编号,第二列:任务所对应的进程号,第三列:任务的运行状态,第四列:启动任务的命令
# 另一种后台方式
nohup scp -r file.path user@remote:/path/to/destination &
#根据jobs -l的查询结果(第一列)
bg %jobnumber
例:
bg 1
#模糊查询文件名
find /home/Seeyon/A8/base/upload -name *-4788887135246072153*
#查日志
find /home/Seeyon/A8/ApacheJetspeed/logs_sy -type f -name "*.log" | xargs grep "附件导出结束"
grep -r "任泽坤-封存"
grep -i "附件导出结束" ctp.log
# 查对应的bean注册在哪里
find . -name "*.xml" | xargs grep "/workflow/designer.do"
du -sh 文件夹名 # 查看文件夹内容大小
du --max-depth 1 -lh upload/ (可以查询子文件夹的大小值)
#查看linux硬盘剩余情况/挂载情况
df -h
#验证接口
curl http://10.10.12.203/seeyonXXX -X POST -d '{"login_username":"system","login_password":"MHsystem2020"}' --header "Content-Type: application/json"
################ 网络方面 #######
netstat -anp | grep 8080 # 查看8080端口被哪个进程占用 lsof -i :8080
# 查看防火墙状态
systemctl status firewalld
service iptables status
# 暂时关闭防火墙(重启重置)
systemctl stop firewalld
service iptables stop # service iptables start
# 永久关闭防火墙
systemctl disable firewalld
chkconfig iptables off
# 重启防火墙
systemctl enable firewalld
service iptables restart
chkconfig iptables on #永久关闭后,要开启,使用这个
# 防火墙 开发特定端口 注:已验证 好使的
firewall-cmd --zone=public --add-port=1935/tcp # 此条即刻生效
firewall-cmd --zone=public --add-port=1935/tcp --permanent #(此条需要重启服务器生效)
命令含义:
--zone #作用域
--add-port=1935/tcp #添加端口,格式为:端口/通讯协议
--permanent #永久生效,没有此参数重启后失效
firewall-cmd --reload # 重启防火墙
# ################## 查看linux内存CPU性能分析 ########################
top # 命令
# 在top命令的输出中,可以按下 Shift + M 键,按照内存使用量进行排序
# 在top命令的输出中,可以按下 Shift + P 键,按照CPU使用量进行排序
# 按两下e可以切换内存单位Mb/Gb
PID:进程的ID(进程标识符)。
USER:启动进程的用户。
PR:进程的优先级。
NI:进程的优先级调整值(nice值)。
VIRT:进程使用的虚拟内存大小。
RES:进程实际使用的物理内存大小(Resident Set Size)。
SHR:进程共享的内存大小。
S:进程的状态,如R(运行)、S(睡眠)、Z(僵尸)等。
%CPU:进程使用的CPU资源百分比。
%MEM:进程使用的物理内存百分比。
TIME+:进程运行的累计CPU时间。
COMMAND:启动进程的命令。
free # 命令
total:表示系统的总内存大小,包括物理内存和交换空间的总和。
used:表示已使用的内存大小,包括已分配给进程使用的内存和内核使用的内存。
free:表示空闲的内存大小,即当前未被使用的内存。
shared:表示被多个进程共享的内存大小。
buff/cache:表示被缓冲区和缓存使用的内存大小。缓冲区(buffer)用于存储文件系统的元数据,缓存(cache)用于存储文件系统的数据块。
available:表示可用的内存大小,即当前可供新进程使用的内存。它的计算方式为 free + buff/cache + swap 其中swap表示交换空间的大小。
Swap:表示交换空间的使用情况,包括总交换空间大小、已使用的交换空间大小和剩余的交换空间大小。
ps aux --sort -rss # 查看进程状态,包括内存 内存使用量进行排序
pmap -x <PID> # 查看该进程的内存映射信息,包括内存区域的起始地址、大小、权限等信息
ps aux --sort -rss | awk '{ printf("%s\t%.2fG\n", $0, $6/1024/1024) }'
# 通过awk的方式可以转换结果为GB
# ################## ###########################
# vim 下进行搜索
使用:/ +'搜索内容' 然后回车,使用'n'和'N'进行定位
# 防火墙开放特定端口 文件/etc/sysconfig/iptables 添加:
-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 3306 -j ACCEPT
# /etc/sysconfig/iptables中的配置,一般默认会有一个22端口开放 3306代表开放3306
# 添加完成后,执行 service iptables restart , serivce iptables save 保存设置
#########
#查看iptables规则及编号 iptables -L -n iptables -L -n --line-number (带编号)
# 只打开某个端口,只打开22端口
iptables -A INPUT -p tcp –dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp –sport 22 -j ACCEPT
iptables -I IN_public_allow -p tcp --dport 8080 -j ACCEPT #
# 参数讲解:
# –A 参数就看成是添加一条规则
# –p 指定是什么协议,我们常用的tcp 协议,当然也有udp,例如53端口的DNS
# –dport 就是目标端口,当数据从外部进入服务器为目标端口
# –sport 数据从服务器出去,则为数据源端口使用
# –j 就是指定是 ACCEPT -接收 或者 DROP 不接收
##禁止某个IP访问 –s 参数是来源(即192.168.1.2) 后面拒绝就是DROP
iptables -A INPUT -p tcp -s 192.168.1.2 -j DROP
iptables -D INPUT 2 # 删除INPUT链编号为2的规则
#iptables防火墙
service iptables status #查看iptables防火墙状态
service iptables start #开启防火墙
service iptables stop #停止防火墙
#firewall防火墙
systemctl status firewalld #查看firewall防火墙服务状态
service firewalld start #开启防火墙
service firewalld stop #关闭防火墙
chmod +x xxx.sh # 给该shell脚本赋予可执行权限
pstree #查看shell层级
echo $name #查看shell变量
name1="${name}" #变量赋值
name2=`ls` #将后面的shell语言执行并将结果赋值给变量
# 每个用户都有它自己的环境变量文件:~/.bash_profile ~/.bashrc 且加载变量以个人配置优先,个人配置 优先生效
# 全局 环境变量 文件:/ect/profile
bash # 进入子shell 本地变量不共享 简写 ./xxx.sh
source XX # 在当前的shell环境中执行shell脚本,不开启子shell 简写为 . xxx.sh
exit # 退出子shell
ps -ef --forest # 检查父子shell的关系
######### 特殊参数变量 #############
echo $0 # 获取文件名
echo $1 # 获取脚本第一个参数
...
echo $# # 获取脚本参数个数
echo $* # 获取全部参数并输出 在双引号中间 多个参数作为一份数据输出
echo $@ # 获取全部参数 在双引号中间 多个参数,各自独立输出
### for 循环,循环出每个参数变量 ###
for var in "$@"
do
echo "$var"
done
######### 特殊状态变量 ###########
echo $? # 上一次命令的执行结果
echo $$ # 当前shell脚本的进程号
echo $! # 上一次后台进程的PID
echo $_ # 上一次命令的最后一个参数
main bash # main手册查看bash命令,以及特殊变量的各种含义,纯英文需要翻译
########## 让命令在后台执行 ############ xxx 可以是命令,也可以是sh脚本 /dev/null 代表,将日志输出到黑洞文件当中, echo $! 可以获取这次的PID
nohup xxx & 1> /dev/null
########## 子串的特殊用法 ############
echo ${#name} # 返回变量长度
echo ${变量:start} # 返回start位置后面的字符
echo ${变量:start:length} # 返回start位置开始 length长度的字符,截取字符串
echo ${变量#word} # 返回 从变量开头删除匹配word字符串 支持通配符,* a*c:代表a到c的字符
echo ${变量##word} # 返回 从变量开头删除匹配最长的word字符串 代表适配了a*c最长情况的字符,进行删除
echo ${变量%word} # 返回 从变量结尾删除匹配word字符串
echo ${变量%%word} # 返回 从变量结尾删除匹配最长的word字符串
echo ${变量/pattern/string} # 用 string 代替第一个匹配的正则
echo ${变量//pattern/string} # 用 string 代替所有匹配的正则
## 一行写多行shell语句,需要加分号
time xxx # 计算shell语句执行时间
touch ceshi_{1..5}.jpg # 创建 ceshi_1 ~ 5 的jpg文件
############# 特殊扩展变量 ##################
${变量:-word} # 如果变量为空,返回word字符串
${变量:=word} # 如果变量为空,赋值word字符给变量,并返回word字符串
${变量:?word} # 如果变量为空,返回word字符串当作 错误信息 返回
${变量:+word} # 如果变量不为空,返回word字符串
################# 开启子shell进程 ##############
(cd ~;pwd;ls;echo $BASH_SUBSHELL) # 括号可以开启子shell,同时可以嵌套运行 : (ls;(ls;(ls;)))
[root@VM-16-13-centos data]# echo $BASH_SUBSHELL
0
[root@VM-16-13-centos data]# (echo $BASH_SUBSHELL)
1
[root@VM-16-13-centos data]#
################# 内置命令,外置命令 ##################
# 内置命令:cd,ls 在系统启动时,就加载到内存当中,执行效率高,但常驻资源 不会产生子进程执行 不需要单独读取某个文件 type cd 显示内嵌的,就是内置命令
# 外置命令:ps,unzip,nigix 系统从磁盘中读取的命令,自己单独下载的命令 且一定会开启子进程执行
compgen -b # 查看系统 内置的shell命令
########## 转义符 ############
echo "价格:\$100"
################ 特殊符号 ############
${vars} # 获取变量结果
$(date) # 获取括号内 执行命令,执行后的执行结果
`` # 获取括号内 执行命令,执行后的执行结果 同上
() # 开启子shell,并执行命令结果
$vars # 获取变量结果
Linux挂载
Linux系统中可以使用mount命令来将磁盘挂载到指定的目录。
首先需要确认已经连接好了磁盘设备(如USB闪存驱动器)或者网络共享文件夹等。
打开终端,输入以下命令查看当前系统上所有的磁盘分区信息:sudo fdisk -l。根据显示结果选取要挂载的磁盘设备名称,比如/dev/sdb1。
创建一个新的目录作为挂载点,比如我们创建一个名为"mydrive"的目录:mkdir /mnt/mydrive。这里的"/mnt/"是默认的挂载点路径,也可以自行修改成其他合适的位置。
运行以下命令进行挂载操作:sudo mount /dev/sdb1 /mnt/mydrive。注意将"/dev/sdb1"替换为实际的磁盘设备名称。
现在该磁盘就被成功地挂载到了"/mnt/mydrive"目录下,可以通过访问该目录来管理磁盘内容。
若想永久性保持挂载状态,还需编辑fstab配置文件。位置:vim /etc/fstab
可以使用任何文本编辑器打开并添加类似于以下条目的记录:/dev/sdb1 /mnt/mydrive ext4 defaults 0 0。然后保存并关闭文件。重启系统时会自动执行挂载操作。
最后,可以使用umount命令来卸载磁盘:sudo umount /mnt/mydrive。再次提醒,将"/mnt/mydrive"替换为实际的挂载点路径。
挂载网络硬盘
目标需要开启nfs服务
卸载原有内容
umount /data
挂载对应目录
-- mount -t nfs -o sync,noac 172.17.3.3:/nfs-file /data
mount -t nfs 172.17.3.3:/nfs-file /data
检查服务器架构 amd / arm
uname -m
// x86_64 如果结果是这个,则是amd的,否则为arm
arch
查看linux是64为还是32位
getconf LONG_BITfile /bin/ls直接查看系统的架构
dpkg --print-architecturearchfile /lib/systemd/systemd注意:
- x86是intel开发的一种32位指令集
- x84_64是CPU迈向64位的时候
- x86_64是一种64位的指令集,x86_64是x86指令的超集,在
x86上可以运行的程序,在x86_64上也可以运行,x86_64是AMD发明的,也叫AMD64
###################wkhtmltopdf###############
## 查看openssl的版本
openssl version -a
检查环境变量的命令
set # 输出所有变量,包括局部变量 需要在同一个会话中的变量
set |grep ^name # 输出以name开头的shell变量
env # 只输出全局变量
export # 只输出环境变量
unset # 删除变量!!
readonly # 设置只读变量
shell 逻辑运算
# 0 为假 ,1 为真 注意:运算只能整数,小数需要使用bc
[root@VM-16-13-centos data]# echo $((6<5))
0
[root@VM-16-13-centos data]# echo $((6<7))
1
[root@VM-16-13-centos data]# echo $((6<7&&5<4))
0
[root@VM-16-13-centos data]# echo $((6<7||5<4))
1
[root@VM-16-13-centos data]# echo $((7+6))
13
[root@VM-16-13-centos data]# echo $((7-6))
1
[root@VM-16-13-centos data]# echo $((7*6))
42
[root@VM-16-13-centos data]# echo $((7/6))
1
[root@VM-16-13-centos data]# echo $((7%6))
1
((n=7%6)) # 变量赋值
echo $((n=7%6)) # 变量赋值并且输出
a++ , a-- # 同java
脚本入门案例
############### 脚本控制返回值 #############
# --------------------脚本内容 s----------------------------
#!/bin/bash
# $# 获取多个参数 -ne 不等于 && 并且符号
[ $# -ne 2]&& {
echo " 必须传入两个参数 !"
exit 119 # 终止程序运行,并且返回119状态码,提供给当前shell的$?变量 可以 return 119 用法
}
echo "没毛病就是两个参数"
# --------------------脚本内容 e----------------------------
#########################################
############### 批量更新文件名 #############
# --------------------脚本内容 s----------------------------
#!/bin/bash
# *fin* 代表筛选文件包含fin的文件
for file_name in `ls *fin*.jpg`
do
mv $file_name `echo ${file_name//_ffinshed/}`
done
# --------------------脚本内容 e----------------------------
#########################################
############### 获取当前时间 #############
# --------------------脚本内容 s----------------------------
#!/bin/bash
echo "当前时间是:`date`"
# --------------------脚本内容 e----------------------------
#########################################
############### 显示你的个人信息 #############
# --------------------脚本内容 s----------------------------
#!/bin/bash
echo "userName:${USER}"
echo "uid:$UID"
echo "Home:" $HOME
# --------------------脚本内容 e----------------------------
[root@VM-16-13-centos data]# bash test.sh
userName:root
uid:0
Home: /root
#########################################
############### 计算脚本 #############
# --------------------脚本内容 s----------------------------
#!/bin/bash
print_usage(){
printf "请输入纯数字!请重新输入"
exit 1 # 退出码
}
read -p "请输入第一个数字:" firstnum
# 注意if 语法 [] 里面前后都需要空格
# -n 参数是if语句对字符串进行判断,如果字符串为空,条件就不成立,如果字符不为空,则条件成立
# sed 作用:将上述字符串 "qwe123" 进行替换,将 字符串里面 包含的所有数字字符 替换为空,剩下纯数字的内容
# 那么,综合上述,该if语句的执行逻辑,就是判断上面输入字符是否是一个纯数字,如果不是,进行提示,并退出
if [ -n "`echo $firstnum|sed 's/[0-9]//g'`" ]
then
print_usage
fi
read -p "请输入运算符:" operator
# 对运算符进行输入判断
if [ "${operator}" != "+" ] && [ "${operator}" != "-" ] && [ "${operator}" != "*" ] && [ "${operator}" != "/" ]
then
echo "只允许输入 +|-|*|/"
exit 2
fi
read -p "请输入第二个数字:" secondnum
if [ -n "`echo $secondnum|sed 's/[0-9]//g'`" ]
then
print_usage
fi
#最后进行计算
echo "${firstnum}${operator}${secondnum}=$((${firstnum}${operator}${secondnum}))"
# --------------------脚本内容 e----------------------------
#########################################