linux 笔记
(1) 新linux机器配置
en_US.UTF-8 zh_CN.UTF-8 都是 UTF-8编码
en_US.UTF-8:你说英语,你在美国,字符集是utf-8
zh_CN.UTF-8:你说中文,你在中国,字符集是utf-8
建议设置成 en_US.UTF-8,因为命令行的结果是英文,不用担心乱码。
(1.1) 配置编码
配置文件一般在 /etc/sysconfig/i18n
/etc/locale.conf
(1.1.1) 查看当前区域编码配置 localectl status
[wkq@VM_77_25_centos ~]$ localectl status
System Locale: LANG=en_US.utf8
VC Keymap: us
X11 Layout: us
(1.1.2) 查看系统默认的语言设置 locale
[wkq@VM_77_25_centos ~]$ locale
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=en_US.utf8
LC_CTYPE=UTF-8
LC_NUMERIC="en_US.utf8"
LC_TIME="en_US.utf8"
LC_COLLATE="en_US.utf8"
LC_MONETARY="en_US.utf8"
LC_MESSAGES="en_US.utf8"
LC_PAPER="en_US.utf8"
LC_NAME="en_US.utf8"
LC_ADDRESS="en_US.utf8"
LC_TELEPHONE="en_US.utf8"
LC_MEASUREMENT="en_US.utf8"
LC_IDENTIFICATION="en_US.utf8"
LC_ALL=
(1.1.3) 查看系统支持的汉语区域语言 localectl list-locales | grep zh
[wkq@VM_77_25_centos ~]$ localectl list-locales | grep zh
zh_CN
zh_CN.gb18030
zh_CN.gb2312
zh_CN.gbk
zh_CN.utf8
zh_HK
zh_HK.big5hkscs
zh_HK.utf8
zh_SG
zh_SG.gb2312
zh_SG.gbk
zh_SG.utf8
zh_TW
zh_TW.big5
zh_TW.euctw
zh_TW.utf8
(1.1.4) 设置语言 localectl set-locale LANG=en_US.utf8
[root@VM_77_25_centos ~]# localectl set-locale LANG=en_US.utf8
[root@VM_77_25_centos ~]#
[root@VM_77_25_centos ~]# source /etc/locale.conf
[root@VM_77_25_centos ~]#
[root@VM_77_25_centos ~]#
[root@VM_77_25_centos ~]# tail -100 /etc/locale.conf
LANG=en_US.utf8
[root@VM_77_25_centos ~]#
(1.2) VI编辑器设置
配置 ~/.vimrc
加上如下几行:
set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936
set termencoding=utf-8
set encoding=utf-8
set nu
(1.3) 其它配置
alias ll='ls -l'
# Java JDK config
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
# Maven config
export MAVEN_HOME=/Users/weikeqin1/SoftWare/apache-maven-3.6.1
export NODE_PATH=/Users/weikeqin1/SoftWare/node/node-v10.16.0-darwin-x64
export PATH=$PATH:$MAVEN_HOME/bin:$NODE_PATH/bin:$NODE_PATH/node_global
# go config
export GOROOT=/usr/local/go
export GOPATH=/Users/weikeqin1/SoftWare/gopath
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
# Setting PATH for Python 2.7
PATH="/System/Library/Frameworks/Python.framework/Versions/2.7/bin:${PATH}"
# Setting PATH for Python 3.7
PATH="/Library/Frameworks/Python.framework/Versions/3.7/bin:${PATH}"
export PATH
(2) linux常用命令
(2.1) 远程登录Linux
远程登录 ssh wkq@192.168.66.88
(2.2) Linux文件和目录
[admin@user01 software]$ ll
total 16
-rw-rw-r-- 1 admin admin 425 Jun 16 14:32 HelloWorld.class
-rw-rw-r-- 1 admin admin 110 Jun 16 14:31 HelloWorld.java
-rwxrwxrwx 1 usdp user1 9271609 Aug 16 11:49 apache-tomcat-8.5.4.tar.gz
-rwxrwxrwx 1 root root 185540433 Aug 16 10:36 jdk-8u131-linux-x64.tar.gz
-rwxrwxrwx 1 root root 641555814 Aug 16 10:35 mysql-5.7.16-linux-glibc2.5-x86_64.tar.gz
最前面那个 – 代表的是类型
rwx 代表的是 可读、可写、可执行
中间那三个 rw- 代表的是所有者(user)
然后那三个 rw- 代表的是组群(group)
最后那三个 r–- 代表的是其他人(other)
是追加内容 > 是覆盖原有内容
find命令
find ./company -type f | wc -l
grep命令
grep -rn "字符串" *
sed 命令
统计文件个数
ls -l |grep "^-"|wc -l #统计当前目录下文件的个数
ls -l |grep "^d"|wc -l #统计当前目录下目录的个数
ls -lR|grep "^-"|wc -l #统计当前目录下文件的个数,包括子目录里的
find ./company -type f | wc -l
ls -lR|grep "^d"|wc -l #统计目录下目录的个数,包括子目录里的
(2.3) 用户和用户组
(2.3.1) 添加用户并设置密码
查看用户 tail -10 /etc/passwd
添加用户 useradd -m user_admin
设置密码 passwd user_admin ********
[root@VM_77_25_centos ~]$ tail -6 /etc/passwd
chrony:x:995:993::/var/lib/chrony:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
wkq:x:1000:1000::/home/wkq:/bin/bash
user_admin:x:1001:1001::/home/user_admin:/bin/bash
user_1:x:1002:1002::/home/user_1:/bin/bash
[root@VM_77_25_centos ~]#
[root@VM_77_25_centos ~]# useradd -m user_admin
[root@VM_77_25_centos ~]# passwd user_admin
Changing password for user user_admin.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
[root@VM_77_25_centos ~]#
(2.3.2) 用户所属组
cat /etc/group 查看用户组
cat /etc/passwd|grep -v nologin|grep -v halt|grep -v shutdown|awk -F":" '{ print $1"|"$3"|"$4 }'|more
(2.4) Linux磁盘管理
(2.5) VI文本编辑器
编辑文本 vi test.txt
(2.6) 压缩和解压缩
(2.7) 安装RPM或源码包
(2.8) shell
(2.9) 正则
(3) 常用运维监控命令
vmstat
vmstat 是一款指定采样周期和次数的功能性监测工具,我们可以使用它监控进程上下文切换的情况。
1
vmstat 1 3 命令行代表每秒收集一次性能指标,总共获取 3 次。
以下为上图中各个性能指标的注释:
procs
r:等待运行的进程数
b:处于非中断睡眠状态的进程数
memory
swpd:虚拟内存使用情况
free:空闲的内存
buff:用来作为缓冲的内存数
cache:缓存大小
swap
si:从磁盘交换到内存的交换页数量
so:从内存交换到磁盘的交换页数量
io
bi:发送到块设备的块数
bo:从块设备接收到的块数
system
in:每秒中断数
cs:每秒上下文切换次数
cpu
us:用户 CPU 使用时间
sy:内核 CPU 系统使用时间
id:空闲时间
wa:等待 I/O 时间
st:运行虚拟机窃取的时间
pidstat
pidstat 命令可以帮助我们监测到具体线程的上下文切换。
pidstat -w -p pid 命令行,我们可以查看到进程的上下文切换
df
[wkq@host-wkq support-files]$ df -hl
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rhel-root 8.0G 6.8G 1.3G 84% /
devtmpfs 16G 0 16G 0% /dev
tmpfs 16G 0 16G 0% /dev/shm
tmpfs 16G 177M 16G 2% /run
tmpfs 16G 0 16G 0% /sys/fs/cgroup
/dev/mapper/rhel-mnt_disk1 1014M 33M 982M 4% /mnt/disk1
/dev/mapper/rhel-home 1017M 184M 834M 19% /home
/dev/vda1 497M 125M 373M 25% /boot
tmpfs 3.2G 0 3.2G 0% /run/user/0
/dev/mapper/datavg-data01 1023G 251G 773G 25% /data00
tmpfs 3.2G 0 3.2G 0% /run/user/501
tmpfs 3.2G 0 3.2G 0% /run/user/1001
tmpfs 3.2G 0 3.2G 0% /run/user/1006
[wkq@host-wkq support-files]$ df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/mapper/rhel-root 5498672 90856 5407816 2% /
devtmpfs 4095200 370 4094830 1% /dev
tmpfs 4097815 1 4097814 1% /dev/shm
tmpfs 4097815 560 4097255 1% /run
tmpfs 4097815 13 4097802 1% /sys/fs/cgroup
/dev/mapper/rhel-mnt_disk1 1048576 3 1048573 1% /mnt/disk1
/dev/mapper/rhel-home 1044480 4599 1039881 1% /home
/dev/vda1 512000 328 511672 1% /boot
tmpfs 4097815 1 4097814 1% /run/user/0
/dev/mapper/datavg-data01 1072693248 6508644 1066184604 1% /data00
tmpfs 4097815 1 4097814 1% /run/user/501
tmpfs 4097815 1 4097814 1% /run/user/1001
tmpfs 4097815 1 4097814 1% /run/user/1006
lsblk
lsblk
[root@host local]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda 252:0 0 22G 0 disk
├─vda1 252:1 0 500M 0 part /boot
└─vda2 252:2 0 18G 0 part
├─rhel-root 253:0 0 8G 0 lvm /
├─rhel-swap 253:1 0 8G 0 lvm [SWAP]
├─rhel-home 253:2 0 1020M 0 lvm /home
└─rhel-mnt_disk1 253:3 0 1G 0 lvm /mnt/disk1
vdb 252:16 0 1T 0 disk
└─datavg-data01 253:4 0 1023G 0 lvm /data00
查看操作系统信息
uname -a
[root@localhost ~]# uname -a
Linux localhost.localdomain 3.10.0-327.el7.x86_64 #1 SMP Thu Nov 19 22:10:57 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
localhost.localdomain 主机名
3.10.0-327.el7.x86_64 内核版本
#1 SMP Thu Nov 19 22:10:57 UTC 2015 x86_64 x86_64 内核编译日期
x86_64 操作系统版本
x86_64 处理器类型
x86_64 硬件平台
GNU/Linux 操作系统
查看cpu统计信息
[root@localhost local]# lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 2
On-line CPU(s) list: 0,1
Thread(s) per core: 1
Core(s) per socket: 1
Socket(s): 2
NUMA node(s): 1
Vendor ID: GenuineIntel
CPU family: 6
Model: 61
Model name: Intel Core Processor (Broadwell)
Stepping: 2
CPU MHz: 2099.998
BogoMIPS: 4199.99
Hypervisor vendor: KVM
Virtualization type: full
L1d cache: 32K
L1i cache: 32K
L2 cache: 4096K
NUMA node0 CPU(s): 0,1
每个cpu信息
[root@localhost local]# cat /proc/cpuinfo
概要查看内存情况
[root@localhost local]# free -m (单位是MB)
total used free shared buff/cache available
Mem: 15887 215 14819 8 852 15378
Swap: 8191 0 8191
查看内存详细使用
[root@localhost ~]# cat /proc/meminfo
查看内存硬件信息
[root@localhost ~]# dmidecode -t memory
查看硬盘和分区分布
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda 252:0 0 100G 0 disk
├─vda1 252:1 0 512M 0 part /boot
└─vda2 252:2 0 99.5G 0 part
├─osvg-lv_root 253:0 0 80G 0 lvm /
└─osvg-lv_swap 253:1 0 8G 0 lvm [SWAP]
vdb 252:16 0 500G 0 disk
看硬盘和分区的详细信息
[root@localhost ~]# fdisk -l
Disk /dev/vda: 107.4 GB, 107374182400 bytes, 209715200 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x0009350c
Device Boot Start End Blocks Id System
/dev/vda1 * 2048 1050623 524288 83 Linux
/dev/vda2 1050624 209715199 104332288 8e Linux LVM
Disk /dev/mapper/osvg-lv_root: 85.9 GB, 85899345920 bytes, 167772160 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/mapper/osvg-lv_swap: 8589 MB, 8589934592 bytes, 16777216 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/vdb: 536.9 GB, 536870912000 bytes, 1048576000 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
定时执行任务
定时执行任务使用crontab命令
首先自己写好shell脚本,然后使用crontab命令调用。 下面是我的crontab配置和对应的脚本
在linux终端输入crontab -e就可以调出定时器的设置vi界面。然后输入下面的语句就可以了
00 01 * * * /usr/local/selectwritefile.sh
查看是否创建成功
crontab -l
启动crontab服务
[admin@localhost selectwritefile]$ /sbin/service crond start
Redirecting to /bin/systemctl start crond.service
==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
Authentication is required to manage system services or units.
Authenticating as: root
Password:
==== AUTHENTICATION COMPLETE ===
#!/bin/bash
# selectwritefile.sh
# program:
# 定时执行java脚本,把数据库中的数据写到磁盘
#导入环境变量
export LANG="en_US.UTF-8"
export JAVA_HOME=/home/admin/software/jdk1.8.0_111
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
echo -e "[`date +%Y-%m-%d_%H:%M:%S`] 开始执行linux shell脚本"
# 注意 这儿路径用绝对路径,用相对路径会导致找不见jar包,java脚本不能运行
java -jar /home/admin/workspace/selectwritefile/selectwritefile-0.0.1.jar /home/admin/corpus
echo -e "[`date +%Y-%m-%d_%H:%M:%S`] linux shell脚本运行完毕。"
crontab参数说明
For details see man 4 crontabs
Example of job definition:
.---------------- minute (0 - 59)
| .------------- hour (0 - 23)
| | .---------- day of month (1 - 31)
| | | .------- month (1 - 12) OR jan,feb,mar,apr ...
| | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
| | | | |
* * * * * user-name command to be executed
在crontab文件中写入需要执行的命令和时间,该文件中每行都包括六个域,其中前五个域是指定命令被执行的时间,最后一个域是要被执行的命令。每个域之间使用空格或者制表符分隔。
除了root用户之外的用户可以执行crontab配置计划任务。所有用户定义的crontab存储在目录/var/spool/cron下,任务会以创建者的身份被执行。要以特定用户创建一个crontab,先以该用户登录,执行命令crontab -e,系统会启动在VISUAL或者EDITOR中指定的的编辑软件编辑crontab。文件内容与/etc/crontab格式相同。
当更改的crontab需要保存时,文件会保存在成如下文件/var/spool/cron/username。文件名会根据用户名而不同。
cron服务会每分钟检查一次/etc/crontab、/etc/cron.d/、/var/spool/cron文件下的变更。如果发现变化,就会下载到存储器中。
因此,即使crontab文件改变了,程序也不需要重新启动。
推荐自定义的任务使用crontab -e命令添加,
退出后用/etc/init.d/crond restart命令重启crond进程,官方文件说不用重启进程,但我遇到不重启无法运行任务的情况。
开始不知道/etc/crontab文件中的run-parts是什么意思,直接把命令按照/etc/crontab的格式加上总是无法运行,
后来才知道run-parts是指后面跟着的是文件夹。
crontab服务的启动关闭
/sbin/service crond start //启动服务
/sbin/service crond stop //关闭服务
/sbin/service crond restart //重启服务
/sbin/service crond reload //重新载入配置
查看进程
ps -ef
ps -ef | grep java
top
ls /proc/ # 查看进程
cd 26489/ #进入该进程对应文件
ls -ail #查看详细信息
(4) 常见问题
Permission denied
-bash: ./test.jar: Permission denied
权限不够
使用chmod命令修改权限
chmod 754 test.jar
Cannot mkdir: Permission denied
权限不够
使用chmod命令修改权限
bin/bash: bad interpreter: No such file or directory
有可能是你的脚本文件是DOS格式的, 即每一行的行尾以/r/n来标识
使用vim编辑器打开脚本, 运行:
:set ff?
可以看到DOS或UNIX的字样. 使用set ff=unix把它强制为unix格式的, 然后保存退出, 即可。
Failed to restart iptables.service: Unit iptables.service failed to load: No such file or directory.
iptables --list #查看防火墙上的可用规则
下例说明当前系统没有定义防火墙,你可以看到,它显示了默认的filter表,以及表内默认的input链, forward链, output链。
[root@host_wkq local]# iptables --list
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@host_wkq local]#
service iptables stop #关闭防火墙
systemctl stop firewalld #关闭防火墙
No space left on device
-bash: vim: command not found
[usdp@host-172-16-11-125 workspaces]$ rpm -qa|grep vim
vim-minimal-7.4.160-1.el7.x86_64
vim-filesystem-7.4.160-1.el7_3.1.x86_64
vim-common-7.4.160-1.el7_3.1.x86_64
vim-enhanced-7.4.160-1.el7_3.1.x86_64
yum -y install vim-enhanced
yum -y install vim*
account locked due to 17 failed logins
登陆次数过多后的处理 Account locked due to failed logins
pam_tally2 --user=username --reset
linux登录后出现-bash-4.1$,解决办法以及造成这样的原因
##首先切换到故障用户
su - test
##复制对应的文件(不要用root直接复制,否则复制过去的东西属主,数组都是root的)
-bash-4.1$ cp /etc/skel/.bash* ~ ##(/etc/skel 新用户老家的样子,所以从这里复制)
-bash-4.1$ ls -la
total 24
drwx------ 2 test test 4096 Nov 5 14:51 .
drwxr-xr-x. 6 root root 4096 Nov 5 14:44 ..
-rw------- 1 test test 21 Nov 5 14:45 .bash_history
-rw-r--r-- 1 test test 18 Nov 5 14:51 .bash_logout
-rw-r--r-- 1 test test 176 Nov 5 14:51 .bash_profile
-rw-r--r-- 1 test test 124 Nov 5 14:51 .bashrc
-bash-4.1$ logout
References
[1] Linux教程
[2] Linux文件系统目录结构
[3] Linux磁盘简介
[4] Linux下定时运行脚本
[5] bin/bash: bad interpreter: No such file or directory
[6] bin/bash: bad interpreter: No such file or directory
[7] Linux下定时执行脚本
[8] Linux Crontab 定时任务 命令详解
[9] Linux通过PID查看进程完整信息
[10] linux 中防火墙配置 iptables 命令参数的含义介绍
[11] 在linux中使用vi 打开文件时,能显示行号
[12] 新建用户到指定的目录
[13] Centos7 locale区域语言设置