Linux——问题手册
rehoni / 2023-11-04
问题1、tar打包排除
具体描述
tar压缩文件夹时排除文件夹中的某些文件和文件夹,如tomcat压缩,排除logs文件夹
解决方案和原理
使用exclude,注意--exclude=tomcat/logs
的logs是没有斜杠的。
--exclude=<范本样式>:排除符合范本样式的文件;
tar -zcvf tomcatbak.tar.gz --exclude=tomcat/logs tomcat
tar --exclude=webapps/ycsbd-service --exclude=webapps/video-service --exclude=webapps/robot-service -zcvf webapps.tar.gz webapps
问题2、df、du查看文件和文件夹大小
-
查看目前所有文件系统的可用空间及使用情形
df -h
-
查看当前目录总共占的容量
du -sh
-
查看当前目录下一级子文件和子目录占用的磁盘容量:–max-depth
du -lh --max-depth=1 du -h --max-depth=0 your_dest_dir/*
-
统计当前文件夹(目录)大小,并按文件大小排序:
du -sh * | sort -n
-
查看指定文件大小可以使用du -sh或du -a:
du -sh your_dest_file
-
列出当前目录中的目录名不包括某字符串的目录的总大小:
du -sh --exclude='exclude_file_name'
问题3、hostname修改服务器名称
解决方案和原理
# 临时修改 hostname test ``#退出shell,在进入即可修改成功 # 永久修改 vi /etc/hostname #里边直接加名字即可
问题4、修改用户默认目录
解决方案和原理
vi /etc/passwd # /users/ems为ems的用户默认目录,修改为目标目录即可
ems:x:1000:501::/users/ems:/bin/tcsh
问题5、查看服务器内存
解决方案和原理
1、free
free -h # free -m 或 free -g
2、top
top
参考
如何查看linux服务器内存使用情况 - 我是冰霜 - 博客园 (cnblogs.com)
问题6、sudo/su损坏
具体描述
普通用户ems(可sudo提权)/管理员用户root
因为服务器root用户不允许直接ssh,只能通过ems用户ssh上传文件,不小心把/usr/bin目录修改成ems用户及用户组,不小心把/usr/bin 改成 ems:ems了,然后su,sudo都没法用了,切不了root。
解决方案和原理
切换tty,然后用root登陆,把权限改回来。
直接 alt + control + F2,F3等等(f1 到 f7 应该都是可以的),一个一个切换过去
chown root:root -R /usr/bin # 注意这样是不行的,对比其他机器就能发现,/usr/bin里的文件/文件夹权限是不同的,例如 su 和sudo就是 chmod 4755 su chmod 4755 sudo
可以查看一下系统日志,/var/log/message;然后切另外一个shell 执行su,查看日志的问题。
问题7、bash脚本运行失败、坏的解释器
具体描述
执行脚本的时候执行脚本解释器异常
/bin/bash^M: 坏的解释器:没有那个文件或目录
解决方案和原理
1、看是否有chmod
2、将在win下编辑的时候,换行结尾是\n\r , 而在linux下 是\n,所以才会有 多出来的\r,转义
sed -i 's/\r$//' build.sh
3、用Windows的notepad++或者vscode,把文件从Windows格式修改为UNIX格式,把行尾序列从CRLF改为LF
问题8、useradd添加用户并指定根目录
参考
1)管理用户(user)的工具或命令
useradd 注:添加用户
adduser 注:添加用户
passwd 注:为用户设置密码
usermod 注:修改用户命令,可以通过usermod 来修改登录名、用户的家目录等等;
pwcov 注:同步用户从/etc/passwd 到/etc/shadow
pwck 注:pwck是校验用户配置文件/etc/passwd 和/etc/shadow 文件内容是否合法或完整;
pwunconv 注:是pwcov 的立逆向操作,是从/etc/shadow和 /etc/passwd 创建/etc/passwd ,然后会删除 /etc/shadow 文件;
finger 注:查看用户信息工具
id 注:查看用户的UID、GID及所归属的用户组
chfn 注:更改用户信息工具
su 注:用户切换工具
sudo 注:sudo 是通过另一个用户来执行命令(execute a command as another user),su 是用来切换用户,然后通过切换到的用户来完成相应的任务,但sudo 能后面直接执行命令,比如sudo 不需要root 密码就可以执行root 赋与的执行只有root才能执行相应的命令;但得通过visudo 来编辑/etc/sudoers来实现;
visudo 注:visodo 是编辑 /etc/sudoers 的命令;也可以不用这个命令,直接用vi 来编辑 /etc/sudoers 的效果是一样的;
sudoedit 注:和sudo 功能差不多;
2)管理用户组(group)的工具或命令
groupadd 注:添加用户组;
groupdel 注:删除用户组;
groupmod 注:修改用户组信息
groups 注:显示用户所属的用户组
grpck
grpconv 注:通过/etc/group和/etc/gshadow 的文件内容来同步或创建/etc/gshadow ,如果/etc/gshadow 不存在则创建;
grpunconv 注:通过/etc/group 和/etc/gshadow 文件内容来同步或创建/etc/group ,然后删除gshadow文件;
解决方案和原理
指定根目录、用户组
# -d指定目录文件夹
# -m新账号名
# -c comment 指定一段注释性描述。
# -d 目录 指定用户主目录,如果此目录不存在,则同时使用-m选项,可以创建主目录。
# -g 用户组 指定用户所属的用户组。
# -G 用户组,用户组 指定用户所属的附加组。
# -s Shell文件 指定用户的登录Shell。
# -u 用户号 指定用户的用户号,如果同时有-o选项,则可以重复使用其他用户的标识号。
useradd -d /users/uk -m uk -G ems
passwd uk
su uk
pwd
添加用户组
# 确认一下是否存在 ems 这个用户组
grep ems /etc/group
# 添加用户组
groupadd ems
# 创建用户添加进用户组
useradd -G ems uk
# 为确保已经将该用户正确的添加到 ems 用户组中,可以查看该用户的属性
id uk
问题9、umask授权文件夹多用户读写权限
解决方案和原理
允许Linux上的目录/users/uk(uk的用户主目录)能被多个用户进行读写,
用户ems(组ems)
用户uk(组uk)
# 切换root
su root
# 将用户uk添加进用户组ems
# -a 代表 append, 也就是将用户添加到新用户组中而不必离开原有的其他用户组。
usermod -a -G ems uk
# 设置目录为
chmod -R 774 /users/uk
# 验证,可以进入uk的home并且进行操作了
su ems
cd /users/uk
ll
==存在一个问题==
如果是uk自己账户建立的文件夹/文件,需要设置一下umask为0022即可
参考:问题13、umask修改用户创建文件/文件夹默认权限
问题10、ssh-keygen建立ssh/scp免密
a服务器,创建公钥
ssh-keygen -t rsa -P ""
# 发送公钥
scp ~/.ssh/id_rsa.pub uk@198.120.100.99:/home/uk
#这样也可以
ssh-copy-id user@host
b服务器
ssh-keygen -t rsa -P ""
# 防止出现/.ssh/authorized_keys: No such file or directory
cat /home/uk/id_rsa.pub >> /home/uk/.ssh/authorized_keys
验证
ssh uk@198.120.100.99
scp -r /users/uk/txbdmb uk@198.120.100.99:/home/uk/docker_share/data/cfg/
这样更简单,只需要在a服务器进行
ssh-copy-id root@198.120.100.99 #这样也可以
scada1:/users/ems> ssh-copy-id root@198.120.100.99
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@198.120.100.99's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'root@198.120.100.99'"
and check to make sure that only the key(s) you wanted were added.
问题11、chmod文件读写权限
在Linux中要修改一个文件夹或文件的权限我们需要用到linux chmod命令来做,下面我写了几个简单的实例大家可参考一下。
chmod [who] [+ | - | =] [mode] 文件名
命令中各选项的含义为
u 表示“用户(user)”,即文件或目录的所有者。
g 表示“同组(group)用户”,即与文件属主有相同组ID的所有用户。
o 表示“其他(others)用户”。
a 表示“所有(all)用户”。它是系统默认值。
操作符号可以是:
+ 添加某个权限。
- 取消某个权限。
= 赋予给定权限并取消其他所有权限(如果有的话)。
设置mode所表示的权限可用下述字母的任意组合:
r 可读。
w 可写。
x 可执行。
X 只有目标文件对某些用户是可执行的或该目标文件是目录时才追加x 属性。
s 在文件执行时把进程的属主或组ID置为该文件的文件属主。方式“u+s”设置文件的用户ID位,“g+s”设置组ID位。
t 保存程序的文本到交换设备上。
u 与文件属主拥有一样的权限。
g 与和文件属主同组的用户拥有一样的权限。
o 与其他用户拥有一样的权限。
文件:读文件内容(r)、写数据到文件(w)、作为命令执行文件(x)。
目录:读包含在目录中的文件名称(r)、写信息到目录中去(增加和删除索引点的连结)、搜索目录(能用该目录名称作为路径名去访问它所包含的文件和子目录)
具体说就是:
(1)有只读权限的用户不能用cd进入该目录:还必须有执行权限才能进入。
(2)有执行权限的用户只有在知道文件名,并拥有读权利的情况下才可以访问目录下的文件。
(3)必须有读和执行权限才可以ls列出目录清单,或使用cd命令进入目录。
(4)有目录的写权限,可以创建、删除或修改目录下的任何文件或子目录,即使使该文件或子目录属于其他用户也是如此。
在终端输入:
ls -l xxx.xxx (xxx.xxx是文件名)
那么就会出现相类似的信息,主要都是这些:
-rw-rw-r--
一共有10位数
其中: 最前面那个 – 代表的是类型
中间那三个 rw- 代表的是所有者(user)
然后那三个 rw- 代表的是组群(group)
最后那三个 r– 代表的是其他人(other)
然后我再解释一下后面那9位数:
r 表示文件可以被读(read)
w 表示文件可以被写(write)
x 表示文件可以被执行(如果它是程序的话)
- 表示相应的权限还没有被授予
现在该说说修改文件权限了
在终端输入:
chmod o w xxx.xxx
表示给其他人授予写xxx.xxx这个文件的权限
chmod go-rw xxx.xxx
表示删除xxx.xxx中组群和其他人的读和写的权限
其中:
u 代表所有者(user)
g 代表所有者所在的组群(group)
o 代表其他人,但不是u和g (other)
a 代表全部的人,也就是包括u,g和o
r 表示文件可以被读(read)
w 表示文件可以被写(write)
x 表示文件可以被执行(如果它是程序的话)
其中:rwx也可以用数字来代替
r ————4
w ———–2
x ————1
\- ————0
行动:
表示添加权限
\- 表示删除权限
= 表示使之成为唯一的权限
当大家都明白了上面的东西之后,那么我们常见的以下的一些权限就很容易都明白了:
-rw——- (600) 只有所有者才有读和写的权限
-rw-r–r– (644) 只有所有者才有读和写的权限,组群和其他人只有读的权限
-rwx—— (700) 只有所有者才有读,写,执行的权限
-rwxr-xr-x (755) 只有所有者才有读,写,执行的权限,组群和其他人只有读和执行的权限
-rwx–x–x (711) 只有所有者才有读,写,执行的权限,组群和其他人只有执行的权限
-rw-rw-rw- (666) 每个人都有读写的权限
-rwxrwxrwx (777) 每个人都有读写和执行的权限
-rwxrwxr--(774) 所有者和组群才有读,写,执行的权限,其他人只有读的权限
问题12、用户锁定、解锁及锁定查看
[root@l01 ~]# passwd -S pispread
pispread PS 2020-04-30 7 99999 15 -1 (Password set, SHA512 crypt.)用户锁定
[root@l01 ~]# passwd -l pispread
Locking password for user pispread.
passwd: Success查看用户
[root@l01 ~]# passwd -S pispread
pispread LK 2020-04-30 7 99999 15 -1 (Password locked.)用户解锁
[root@l01 ~]# passwd -u pispread
Unlocking password for user pispread.
passwd: Success查看用户
[root@l01 ~]# passwd -S pispread
pispread PS 2020-04-30 7 99999 15 -1 (Password set, SHA512 crypt.)
如果是root用户锁定,可以考虑使用能够提权的普通用户ems
pam_tally2解锁用户
scada1:/users/ems> sudo su
[sudo] password for ems:
[root@scada1 ems]# pam_tally2 --user=root --reset
Login Failures Latest failure From
root 11 09/15/21 12:02:35 pts/0
问题13、umask修改用户创建文件/文件夹默认权限
umask,umask的值越大,新建文件和文件夹的权限就越小,系统就越安全。
- 临时生效,退出后就会失效:umask 数字
- 永久生效:只对当前用户永久生效。编辑用户家目录的隐藏文件“.bashrc”,添加“umask 数字”,退出从新登陆后生效。如不想退出,使用“source 文件路径”可立马生效。
- 对全部用户永久生效(不建议):修改“/etc/bashrc”,添加“umask 数字”,“source 文件路径”立马生效。可是,不建议修改此文件,会不稳定!!!
# 直观的查看默认权限
umask -S
# 临时修改默认权限
umask 0022
# 永久生效
vi ~/.bashrc
# 直接添加一行 umask 0022,保存退出之后查看
source ~/.bashrc
umask
# 对全部用户永久生效
vi /etc/bashrc
umask 0022
第一个0表示是文件或目录的特殊权限
第二个0表示文件或目录的拥有者有所有的rwx权限
第三个2表示文件或目录的所属组被拿走了w权限,及所属组的权限是r-x
第四个2表示文件或目录的其他人被拿走了w权限,及其他人的权限是r-x
新建目录的默认权限是:rwxr-xr-x
新建文件的默认权限是:rw-r–r–(Linux中文件默认都会拿走x权限)
文件权限计算方法
目录权限计算方法
问题14、chage修改密码有效期
-m:密码可更改的最小天数。为零时代表任何时候都可以更改密码。
-M:密码保持有效的最大天数。
-w:用户密码到期前,提前收到警告信息的天数。
-E:帐号到期的日期。过了这天,此帐号将不可用。
-d:上一次更改的日期。
-i:停滞时期。如果一个密码已过期这些天,那么此帐号将不可用。
-l:例出当前的设置。由非特权用户来确定他们的密码或帐号何时过期。
chage -M 99999 root
chage -l root
chage -I 5 root
问题15、lsof查看端口占用情况
su root
lsof -i:8080:查看8080端口占用
lsof abc.txt:显示开启文件abc.txt的进程
lsof -c abc:显示abc进程现在打开的文件
lsof -c -p 1234:列出进程号为1234的进程所打开的文件
lsof -g gid:显示归属gid的进程情况
lsof +d /usr/local/:显示目录下被进程开启的文件
lsof +D /usr/local/:同上,但是会搜索目录下的目录,时间较长
lsof -d 4:显示使用fd为4的进程
lsof -i -U:显示所有打开的端口和UNIX domain文件
netstat -tunlp | grep 端口号
-t (tcp) 仅显示tcp相关选项
-u (udp)仅显示udp相关选项
-n 拒绝显示别名,能显示数字的全部转化为数字
-l 仅列出在Listen(监听)的服务状态
-p 显示建立相关链接的程序名
netstat -ntlp //查看当前所有tcp端口
netstat -ntulp | grep 80 //查看所有80端口使用情况
netstat -ntulp | grep 3306 //查看所有3306端口使用情况
问题16、ethtool修改网卡速率
> uname -a
Linux web1 3.10.0-514.el7.x86_64 #1 SMP Wed Oct 19 11:24:13 EDT 2016 x86_64 x86_64 x86_64 GNU/Linux
> ethtool -s eno1 speed 100 duplex full autoneg off
Cannot set new settings: Operation not supported
not setting speed
not setting duplex
not setting autoneg
ethtool -s eno1 speed 1000 duplex full autoneg off
问题17、sftp配置失败排查
service vsftpd status
journalctl -xe
# vsftpd.service: control process exited, code=exited status=1
# 怀疑是配置出现问题,修改配置 listen_ipv6=NO 并进行重启即可
service vsftpd restart
# sftp
# 但是若在设置 vsftpd.conf 的 listen_ipv6=NO 的同时仍然设置 listen=NO 会出下如下问题:
# can't get client address: Socket operation on non-socket
# 配置的时候需要注意设置 listen=YES
vi vsftpd.conf
listen=YES
listen_ipv6=NO
service vsftpd status
netstat -anp |grep 21
vsftpd.conf中的userlist_enable和userlist_deny两个配置项各自起什么作用,两者如何搭配使用?
user_config_dir=/etc/vsftpd/users
userlist_enable=YES
userlist_file=/etc/vsftpd/denied_users
- userlist_enable和userlist_deny两个选项联合起来针对的是:本地全体用户(除去ftpusers中的用户)和出现在user_list文件中的用户以及不在在user_list文件中的用户这三类用户集合进行的设置。
- 当且仅当userlist_enable=YES时:userlist_deny项的配置才有效,user_list文件才会被使用;当其为NO时,无论userlist_deny项为何值都是无效的,本地全体用户(除去ftpusers中的用户)都可以登入FTP
- 当userlist_enable=YES时,userlist_deny=YES时:user_list是一个黑名单,即:所有出现在名单中的用户都会被拒绝登入;
- 当userlist_enable=YES时,userlist_deny=NO时:user_list是一个白名单,即:只有出现在名单中的用户才会被准许登入(user_list之外的用户都被拒绝登入);另外需要特别提醒的是:使用白名单后,匿名用户将无法登入!除非显式在user_list中加入一行:anonymous
问题18、curl下载文件到本地
curl https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh -o filename.suffix
--silent 不打印输出
--progress 打印下载进度
-o 重命名
问题19、端口测试通不通(四种方法)
# 1、wget ip:port
wget ip:port
#2、telnet
telnet ip port
#3、curl
curl -v ip:port
#4、ssh
ssh -v -p port username@ip
-v 调试模式(会打印日志).
-p 指定端口
问题20、同步远程服务器上文件到本地(文件名中有特殊字符)【存疑】
scp、rsync两种方式
# 怀疑是部分linux操作系统下文件名需要转义才能传输
scp root@198.87.103.240:/root/hello291#2813#123.txt /users/ems/
# 转义后的写法
scp root@198.87.103.240:'/root/hello291\#2813\#123.txt' /users/ems/
# 注意rsync时文件名中的#(应该)不需要做转义
rsync -vzrtopg --progress -e ssh --delete root@198.87.103.240:/root/hello291#2813#123.txt /users/ems/
因怀疑是部分linux操作系统下文件名需要转义才能传输,怀疑不同的操作系统的同类型shell(测试的两个环境为不同国产操作系统麒麟和凝思的同tcsh,存在scp需要转义和不需要转义的情况),也会有该问题产生。
问题21、查看当前shell
scada11:/users/ems> echo $0
-tcsh
scada11:/users/ems> echo $SHELL
/bin/tcsh
scada11:/users/ems> cat /etc/shells
# /etc/shells: valid login shells
/bin/sh
/bin/dash
/bin/bash
/bin/rbash
/bin/ksh93
/bin/mksh
/bin/mksh-static
/usr/bin/screen
/bin/tcsh
/usr/bin/tcsh
scada11:/users/ems>
修改用户默认shell
# 使用chsh命令修改某用户的默认shell
merle@bogon ~ ❯❯❯ chsh
Changing shell for merle.
New shell [/bin/bash]: /bin/zsh
密码:
Shell changed.
merle@bogon ~ ❯❯❯
# 再次查看该用户设置
merle@bogon ~ ❯❯❯ grep merle /etc/passwd
merle:x:1000:1000:merle:/home/merle:/bin/zsh
# 使用usermod命令
usermod -s /bin/zsh merle
# 再次查看该用户设置
merle@bogon ~ ❯❯❯ grep merle /etc/passwd
merle:x:1000:1000:merle:/home/merle:/bin/zsh
# 可以在创建用户的时候指定默认shell.
useradd -s /bin/zsh username
问题23、查看linux系统版本
一、查看Linux系统版本的命令(3种方法)
# 1、cat /etc/issue,此命令也适用于所有的Linux发行版。
[root@S-CentOS home]# cat /etc/issue
CentOS release 6.5 (Final)
Kernel \r on an \m
# 2、cat /etc/redhat-release,这种方法只适合Redhat系的Linux:
[root@S-CentOS home]# cat /etc/redhat-release
CentOS release 6.5 (Final)
# 3、lsb_release -a,即可列出所有版本信息:
[root@S-CentOS ~]# lsb_release -a
LSB Version: :base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-noarch
Distributor ID: CentOS
二、查看Linux内核版本命令(两种方法):
cat /proc/version
uname -a
问题24、查看操作系统编码
# 查看
locale
# 修改
vi /etc/sysconfig/i18n
然后,如改成中文编码:
LANG=en_US.UTF-8
改为
LANG="zh_CN.GBK"
source /etc/sysconfig/i18n
问题25、系统路径/usr/lib/systemd/system和/etc/systemd/system的区别?
使用man systemd.unit
命令,可以看到详细的解释。
大体区别:
/usr/lib/systemd/system
: 安装包相关配置,一般是供应商提供的操作系统资源。通常,只允许包管理工具(yum/dnf/rpm/apt)进行包安装的过程中操作此路径;/lib/systemd/system
: 指向/usr/lib/systemd/system
。/etc/systemd/system
:本地配置文件,系统管理员手动软件安装包或脚本放置于此。
问题26、crontab示例
Linux Crontab 格式
MIN HOUR DOM MON DOW CMD
字段 | 描述 | 允许值 |
---|---|---|
MIN | 分钟字段 | 0 到 59 |
HOUR | 小时字段 | 0 到 23 |
DOM | 每月的某一天 | 1-31 |
MON | 月份字段 | 1-12 |
DOW | 星期几 | 0-6 |
CMD | 命令 | 要执行的任何命令。 |
1.为特定时间安排作业
cron 的基本用法是在特定的时间执行一个作业,如下所示。这将在6 月 10 日上午 08:30执行完整备份 shell 脚本(完整备份)。 `` 请注意,时间字段使用 24 小时格式。因此,对于上午 8 点使用 8,对于晚上 8 点使用 20。
30 08 10 06 * /home/ramesh/full-backup
- 30 – 30 分钟
- 08 – 08 上午
- 10 – 第 10 天
- 06 – 第 6 个月(六月)
- ***** – 一周中的每一天
2. 为多个实例安排作业(例如,一天两次)
以下脚本每天进行两次增量备份。 `` 本示例在每天的 11:00 和 16:00 执行指定的增量备份 shell 脚本(incremental-backup)。字段中的逗号分隔值指定该命令需要在所有提到的时间内执行。
00 11,16 * * * /home/ramesh/bin/incremental-backup
- 00 – 第 0 分钟(一小时的顶部)
- 上午11,16 – 11 点和下午 4 点
- ***** – 每天
- ***** – 每个月
- ***** – 一周中的每一天
3. 安排特定时间范围的工作(例如仅在工作日)
如果您希望在特定时间范围内每小时安排一次作业,请使用以下内容。
每天工作时间的 Cron Job
本示例在每天上午 9 点至下午 6 点的工作时间内(包括周末)检查数据库的状态
00 09-18 * * * /home/ramesh/bin/check-db-status
- 00 – 第 0 分钟(一小时的顶部)
- 09-18 – 9 am, 10 am, 11 am, 12 am, 1 pm, 2 pm, 3 pm, 4 pm, 5 pm, 6 pm
- ***** – 每天
- ***** – 每个月
- ***** – 一周中的每一天
Cron Job 每个工作日的工作时间
本示例在每个工作日(即不包括周六和周日)的工作时间上午 9 点至下午 6 点检查数据库的状态
00 09-18 * * 1-5 /home/ramesh/bin/check-db-status
- 00 – 第 0 分钟(一小时的顶部)
- 09-18 – 9 am, 10 am, 11 am, 12 am, 1 pm, 2 pm, 3 pm, 4 pm, 5 pm, 6 pm
- ***** – 每天
- ***** – 每个月
- **1-5 -**周一、周二、周三、周四和周五(每个工作日)
4. 如何查看 Crontab 条目?
- 查看当前登录用户的 Crontab 条目
要查看您的 crontab 条目,请从您的 unix 帐户键入 crontab -l,如下所示。
ramesh@dev-db$ crontab -l
@yearly /home/ramesh/annual-maintenance
*/10 * * * * /home/ramesh/check-disk-space
[Note: This displays crontab of the current logged in user]
- 查看根 Crontab 条目
以 root 用户 (su – root) 登录并执行 crontab -l ,如下所示。
root@dev-db# crontab -l
no crontab for root
- Crontab HowTo:查看其他 Linux 用户的 Crontab 条目
要查看其他 Linux 用户的 crontab 条目,请登录到 root 并使用**-u {username} -l**,如下所示。
root@dev-db# crontab -u sathiya -l
@monthly /home/sathiya/monthly-backup
00 09-18 * * * /home/sathiya/check-db-status
5. 如何编辑 Crontab 条目?
- 编辑当前登录用户的 Crontab 条目
要编辑 crontab 条目,请使用 crontab -e,如下所示。默认情况下,这将编辑当前登录的用户 crontab。
ramesh@dev-db$ crontab -e
@yearly /home/ramesh/centos/bin/annual-maintenance
*/10 * * * * /home/ramesh/debian/bin/check-disk-space
~
"/tmp/crontab.XXXXyjWkHw" 2L, 83C
[Note: This will open the crontab file in Vim editor for editing.
Please note cron created a temporary /tmp/crontab.XX... ]
当你用 :wq 保存上述临时文件时,它会保存 crontab 并显示以下消息,表明 crontab 修改成功。
~
"crontab.XXXXyjWkHw" 2L, 83C written
crontab: installing new crontab
- 编辑根 Crontab 条目
以 root 用户 (su – root) 登录并执行 crontab -e,如下所示。
root@dev-db# crontab -e
- 编辑其他 Linux 用户的 Crontab 文件条目
要编辑其他 Linux 用户的 crontab 条目,请登录到 root 并使用**-u {username} -e**,如下所示。
root@dev-db# crontab -u sathiya -e
@monthly /home/sathiya/fedora/bin/monthly-backup
00 09-18 * * * /home/sathiya/ubuntu/bin/check-db-status
~
~
~
"/tmp/crontab.XXXXyjWkHw" 2L, 83C
6. 使用 Cron 每分钟安排一个作业。
理想情况下,您可能不需要每分钟安排一次作业。但是理解这个例子将帮助你理解本文下面提到的其他例子。
* * * * * CMD
* 表示所有可能的单位——即全年每小时的每一分钟。除了直接使用这个 *,您会发现它在以下情况下非常有用。
- 当您在分钟字段中指定 */5 时,表示每 5 分钟一次。
- 当您在分钟字段中指定 0-10/2 时,意味着在前 10 分钟内每 2 分钟一次。
- 因此,上述约定可用于所有其他 4 个字段。
7. 每 10 分钟安排一个后台 Cron 作业。
如果您想每 10 分钟检查一次磁盘空间,请使用以下方法。
*/10 * * * * /home/ramesh/check-disk-space
它全年每 10 分钟执行一次指定的命令 check-disk-space。但是您可能需要仅在办公时间执行命令,反之亦然。上面的例子展示了如何做这些事情。
我们可以使用单个关键字来指定它,而不是在 5 个字段中指定值,如下所述。
在某些特殊情况下,您可以使用 @ 后跟关键字来代替上述 5 个字段,例如重新启动、午夜、每年、每小时。
关键词 | 相等的 |
---|---|
@yearly | 0 0 1 1 * |
@daily | 0 0 * * * |
@hourly | 0 * * * * |
@reboot | Run at startup. |
8. 使用@yearly 在每年的第一分钟安排工作
如果您希望在每年的第一分钟执行一项工作,那么您可以使用**@yearly** cron 关键字,如下所示。
这将在每年 1 月 1 日的 00:00 使用年度维护 shell 脚本执行系统年度维护。
@yearly /home/ramesh/red-hat/bin/annual-maintenance
9. 使用@monthly 安排每个月开始的 Cron 作业
它与上面的@yearly 相似。但是使用**@monthly** cron 关键字每月执行一次命令。
这将在每月 1 日的 00:00 执行 shell 脚本磁带备份。
@monthly /home/ramesh/suse/bin/tape-backup
10. 每天使用@daily 安排后台作业
使用**@daily** cron 关键字,这将在每天 00:00 使用 cleanup-logs shell 脚本执行每日日志文件清理。
@daily /home/ramesh/arch-linux/bin/cleanup-logs "day started"
11.如何在每次重启后使用@reboot 执行 Linux 命令?
使用**@reboot** cron 关键字,这将在机器每次启动后执行一次指定的命令。
@reboot CMD
12. 如何使用 MAIL 关键字禁用/重定向 Crontab 邮件输出?
默认情况下,crontab 将作业输出发送给安排作业的用户。如果要将输出重定向到特定用户,请在 crontab 中添加或更新 MAIL 变量,如下所示。
ramesh@dev-db$ crontab -l
MAIL="ramesh"
@yearly /home/ramesh/annual-maintenance
*/10 * * * * /home/ramesh/check-disk-space
[Note: Crontab of the current logged in user with MAIL variable]
如果您不希望将邮件发送到任何地方,即停止通过电子邮件发送 crontab 输出,请在 crontab 中添加或更新 MAIL 变量,如下所示。
MAIL=""
13. 如何使用 Crontab 每秒执行一次 Linux Cron 作业。
您不能安排每秒一次的 cronjob。因为在 cron 中,您可以指定的最小单位是分钟。在典型的场景中,我们大多数人没有理由每秒在系统中运行任何作业。
14.在Crontab中指定PATH变量
以上所有例子我们都指定了需要执行的Linux命令或shell-script的绝对路径。
例如,如果您只想指定tape-backup,而不是指定/home/ramesh/tape-backup,则将路径/home/ramesh 添加到crontab 中的PATH 变量中,如下所示。
ramesh@dev-db$ crontab -l
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/home/ramesh
@yearly annual-maintenance
*/10 * * * * check-disk-space
[Note: Crontab of the current logged in user with PATH variable]
15. 从 Cron 文件安装 Crontab
除了直接编辑 crontab 文件之外,您还可以先将所有条目添加到 cron 文件中。在文件中包含所有这些条目后,您可以将它们上传或安装到 cron,如下所示。
ramesh@dev-db$ crontab -l
no crontab for ramesh
$ cat cron-file.txt
@yearly /home/ramesh/annual-maintenance
*/10 * * * * /home/ramesh/check-disk-space
ramesh@dev-db$ crontab cron-file.txt
ramesh@dev-db$ crontab -l
@yearly /home/ramesh/annual-maintenance
*/10 * * * * /home/ramesh/check-disk-space
**注意:**这会将 cron-file.txt 安装到您的 crontab,这也将删除您的旧 cron 条目。因此,从 cron-file.txt 上传 cron 条目时请注意。
==crontab 语法格式中特殊符号含义如下表==
特殊符号 含义
* *号,表示任意时间都,实际就是“每”的意思
- 减号表示分隔符,表示一个时间范围,区间段,如17-19点,例如:每天的17,18,19点的00分执行任务。00 17-19 * * * cmd
, 逗号,表示分隔时段的意思例如每天的5点10点00分执行任务,00 5,10 * * * cmd
/n n代表数字,即“每隔n单位时间”,例如:每10分钟执行一次任务可以写成/*10 * * * * cmd,其中,/10,的范围是0-59,因此也可以写成0-59/10
==定时任务日志==
# 不记录日志,在每一行定时任务后面加上:
> /dev/null 2>&1
# 日志记录追加到指定文件
>> /path/mylog.log 2>&1
说明:
> /dev/null 将输出重定向到/dev/null,这是个空设备,也就是忽略其输出。
2>&1 是将错误输出到标准输出,如果在控制台调试,也就是屏幕上,方便调试。
有3个默认的i/o,0是标准输入,一般是键盘;1是标准输出,一般是屏幕了;2是标准错误。
问题27、ping不通或丢包时如何进行链路测试?
问题描述
在云服务器上访问其他网络资源时,出现网络卡顿。执行ping命令,存在丢包或时延过高的问题。
原因分析
丢包或时延较高可能是链路拥塞、链路节点故障、服务器负载高、系统设置问题等原因引起。
在排除云服务器自身原因后,您可以使用Tracert或MTR工具进行进一步诊断。
使用网络诊断工具MTR可以帮助您确认网络问题的根因。
Linux操作系统MTR介绍和使用
安装MTR
目前现有的Linux发行版本都预装了MTR,如果您的Linux云服务器没有安装MTR,则可以执行以下命令进行安装:
-
CentOS 操作系统:
yum install mtr
-
Ubuntu 操作系统:
sudo apt-get install mtr
MTR相关参数说明
- -h/–help:显示帮助菜单。
- -v/–version:显示MTR版本信息。
- -r/–report:结果以报告形式输出。
- -p/–split:与 –report相对,分别列出每次追踪的结果。
- -c/–report-cycles:设置每秒发送的数据包数量,默认是10。
- -s/–psize:设置数据包的大小。
- -n/–no-dns:不对IP地址做域名解析。
- -a/–address:用户设置发送数据包的IP地址,主要用户单一主机多个IP地址的场景。
- -4:IPv4。
- -6:IPv6。
以本机到IP为119.xx.xx.xx的服务器为例。
执行以下命令,以报告形式输出MTR的诊断报告。
mtr 119.xx.xx.xx – report
回显信息如下:
[root@ecs-0609 ~]# mtr 119.xx.xx.xx --report
Start: Thu Aug 22 15:41:22 2019
HOST: ecs-652 Loss% Snt Last Avg Best Wrst StDev
1.|-- 100.70.0.1 0.0% 10 3.0 3.4 2.8 7.5 1.3
2.|-- 10.242.7.174 0.0% 10 52.4 51.5 34.2 58.9 6.3
3.|-- 10.242.7.237 0.0% 10 3.2 5.0 2.7 20.8 5.5
4.|-- 10.230.2.146 0.0% 10 1.0 1.0 1.0 1.1 0.0
5.|-- 192.168.21.1 0.0% 10 3.5 4.2 2.8 11.6 2.5
6.|-- 10.242.7.238 0.0% 10 35.3 34.5 6.0 56.4 22.6
7.|-- 10.242.7.173 0.0% 10 3.3 4.7 3.1 14.7 3.6
8.|-- ??? 100.0 10 0.0 0.0 0.0 0.0 0.0
主要输出的信息如下:
- HOST:节点的IP地址或域名。
- Loss%:丢包率。
- Snt:每秒发送的数量包的数量。
- Last:最近一次的响应时间。
- Avg:平均响应时间。
- Best:最短的响应时间。
- Wrst:最长的响应时间。
- StDev:标准偏差,偏差值越高,说明各个数据包在该节点的响应时间相差越大。
WinMTR和MTR的报告分析处理
以下图为例分析WinMTR和MTR的报告。
- 服务器本地网络:即图中A区域,代表本地局域网和本地网络提供商网络。
- 如果客户端本地网络中的节点出现异常,则需要对本地网络进行相应的排查分析。
- 如果本地网络提供商网络出现异常,则需要向当地运营商反馈问题。
- 运营商骨干网络:即图中B区域,如果该区域出现异常,可以根据异常节点的IP查询其所属的运营商,向对应运营商进行反馈。
- 目标端本地网络:即图中C区域,即目标服务器所属提供商的网络。
- 如果丢包发生在目的服务器,则可能是目的服务器的网络配置原因,请检查目的服务器的防火墙配置。
- 如果丢包发生在接近目的服务器的几跳,则可能是目标服务器所属提供商的网络问题。
常见的链路异常案例
-
目标主机配置不当
如下示例所示,数据包在目标地址出现了100%的丢包。从数据上看是数据包没有到达,其实很有可能是目标服务器网络配置原因,需检查目的服务器的防火墙配置。
Host Loss% Snt Last Avg Best Wrst StDev 1. ??? 2. ??? 3. 1XX.X.X.X 0.0% 10 521.3 90.1 2.7 521.3 211.3 4. 11X.X.X.X 0.0% 10 2.9 4.7 1.6 10.6 3.9 5. 2X.X.X.X 80.0% 10 3.0 3.0 3.0 3.0 0.0 6. 2X.XX.XX.XX 0.0% 10 1.7 7.2 1.6 34.9 13.6 7. 1XX.1XX.XX.X 0.0% 10 5.2 5.2 5.1 5.2 0.0 8. 2XX.XX.XX.XX 0.0% 10 5.3 5.2 5.1 5.3 0.1 9. 1XX.1XX.XX.X 100.0% 10 0.0 0.0 0.0 0.0 0.0
-
ICMP限速
如下示例所示,在第5跳出现丢包,但后续节点均未见异常。所以推断是该节点ICMP限速所致。该场景对最终客户端到目标服务器的数据传输不会有影响,分析时可以忽略此种场景。
Host Loss% Snt Last Avg Best Wrst StDev 1. 1XX.XX.XX.XX 0.0% 10 0.3 0.6 0.3 1.2 0.3 2. 1XX.XX.XX.XX 0.0% 10 0.4 1.0 0.4 6.1 1.8 3. 1XX.XX.XX.XX 0.0% 10 0.8 2.7 0.8 19.0 5.7 4. 1XX.XX.XX.XX 0.0% 10 6.7 6.8 6.7 6.9 0.1 5. 1XX.XX.XX.XX 0.0% 10 27.2 25.3 23.1 26.4 2.9 6. 1XX.XX.XX.XX 0.0% 10 39.1 39.4 39.1 39.7 0.2 7. 1XX.XX.XX.XX 0.0% 10 39.6 40.4 39.4 46.9 2.3 8. 1XX.XX.XX.XX 0.0% 10 39.6 40.5 39.5 46.7 2.2
-
环路
如下示例所示,数据包在第5跳之后出现了循环跳转,导致最终无法到达目标服务器。出现此场景是由于运营商相关节点路由配置异常所致,需联系相应节点归属运营商处理。
Host Loss% Snt Last Avg Best Wrst StDev 1. 1XX.XX.XX.XX 0.0% 10 0.3 0.6 0.3 1.2 0.3 2. 1XX.XX.XX.XX 0.0% 10 0.4 1.0 0.4 6.1 1.8 3. 1XX.XX.XX.XX 0.0% 10 0.8 2.7 0.8 19.0 5.7 4. 1XX.XX.XX.XX 0.0% 10 6.7 6.8 6.7 6.9 0.1 5. 1XX.XX.XX.65 0.0% 10 0.0 0.0 0.0 0.0 0.0 6. 1XX.XX.XX.65 0.0% 10 0.0 0.0 0.0 0.0 0.0 7. 1XX.XX.XX.65 0.0% 10 0.0 0.0 0.0 0.0 0.0 8. 1XX.XX.XX.65 0.0% 10 0.0 0.0 0.0 0.0 0.0 9. ??? 0.0% 10 0.0 0.0 0.0 0.0 0.0
-
链路中断
如下示例所示,数据包在第4跳之后就无法收到任何反馈。这通常是由于相应节点中断所致。建议结合反向链路测试做进一步确认。该场景需要联系相应节点归属运营商处理。
Host Loss% Snt Last Avg Best Wrst StDev 1. 1XX.XX.XX.XX 0.0% 10 0.3 0.6 0.3 1.2 0.3 2. 1XX.XX.XX.XX 0.0% 10 0.4 1.0 0.4 6.1 1.8 3. 1XX.XX.XX.XX 0.0% 10 0.8 2.7 0.8 19.0 5.7 4. 1XX.XX.XX.XX 0.0% 10 6.7 6.8 6.7 6.9 0.1 5. 1XX.XX.XX.XX 0.0% 10 0.0 0.0 0.0 0.0 0.0 6. 1XX.XX.XX.XX 0.0% 10 0.0 0.0 0.0 0.0 0.0 7. 1XX.XX.XX.XX 0.0% 10 0.0 0.0 0.0 0.0 0.0 8. 1XX.XX.XX.XX 0.0% 10 0.0 0.0 0.0 0.0 0.0 9 1XX.XX.XX.XX 0.0% 10 0.0 0.0 0.0 0.0 0.0
问题28、linux几种常见的Shell:sh、bash、csh、tcsh、ash
Shell 就是这样的一款软件,不同的组织机构开发了不同的 Shell,它们各有所长,有的占用资源少,有的支持高级编程功能,有的兼容性好,有的重视用户体验。
Shell 既是一种脚本编程语言,也是一个连接内核和用户的软件。
常见的 Shell 有 sh、bash、csh、tcsh、ash 等。
sh
sh 的全称是 Bourne shell,由 AT&T 公司的 Steve Bourne开发,为了纪念他,就用他的名字命名了。
sh 是 UNIX 上的标准 shell,很多 UNIX 版本都配有 sh。sh 是第一个流行的 Shell。
csh
sh 之后另一个广为流传的 shell 是由柏克莱大学的 Bill Joy 设计的,这个 shell 的语法有点类似C语言,所以才得名为 C shell ,简称为 csh。
Bill Joy 是一个风云人物,他创立了 BSD 操作系统,开发了 vi 编辑器,还是 Sun 公司的创始人之一。
BSD 是 UNIX 的一个重要分支,后人在此基础上发展出了很多现代的操作系统,最著名的有 FreeBSD、OpenBSD 和 NetBSD,就连 Mac OS X 在很大程度上也基于BSD。
tcsh
tcsh 是 csh 的增强版,加入了命令补全功能,提供了更加强大的语法支持。
ash
一个简单的轻量级的 Shell,占用资源少,适合运行于低内存环境,但是与下面讲到的 bash shell 完全兼容。
bash
bash shell 是 Linux 的默认 shell,本教程也基于 bash 编写。
bash 由 GNU 组织开发,保持了对 sh shell 的兼容性,是各种 Linux 发行版默认配置的 shell。
bash 兼容 sh 意味着,针对 sh 编写的 Shell 代码可以不加修改地在 bash 中运行。
尽管如此,bash 和 sh 还是有一些不同之处:
- 一方面,bash 扩展了一些命令和参数;
- 另一方面,bash 并不完全和 sh 兼容,它们有些行为并不一致,但在大多数企业运维的情况下区别不大,特殊场景可以使用 bash 代替 sh。
问题29、tmpfs使用
优势:
\1. 动态文件系统的大小
\2. 读写速度快。典型的tmpfs文件系统会完全驻留在RAM中,读写几乎是瞬间完成。
\3. Tmpfs中的数据在重新启动之后不会保留,因为虚拟内存本质上是易失的,所以有必要做些脚本做诸如加载、绑定的操作。
/dev/shm如何修改大小
关于/dev/shm容量的问题,在linux下,默认/dev/shm为实际物理内存的1/2,使用df –h命令查看。实际上它不会真正的占用这块内存。如果/dev/shm下没有任何文件,它实际占用的内存就是0字节;如果它最大为1G,里面放有100M的文件,那么剩余的900M任然可以被其他应用程序所使用,但是已经占用的这100M内存空间是不会被系统回收重新划分的。
临时调整tmpfs大小,重启后失效
默认的最大一半内存在某些场合可能不够用,并且默认的额inode数量很低,一般都要调高些,可以用下面的命令来实现
#mount–o size=1500m –o nr_inodes=1000000 –o noatime,nodiratime –o remount /dev/shm
在2G的机器上,/dev/shm最大尺寸调整到1.5G,并且inode数量调整到1000000,这意味着大致可存入100万个小文件
永久修改tmpfs大小,修改/etc/fstab文件
tmpfs /dev/shm tmpfsdefaults,size=1500M 0 0
修改之后remount
#mount –o remount /dev/shm
注意:
这里一定要注意,修改的size一定要是整数,否则在remount时候会遇到如下问题
三、/dev/shm应用
首先在/dev/shm建个tmp文件夹,然后与实际/tmp绑定,把/dev/shm绑定到/tmp目录上 #mkdir /dev/shm/tmp #chmod 777 /dev/shm/tmp #mount –bind /dev/shm/tmp/tmp(–bind ) 在使用mount –bind olderdirnewerdir命令来挂载一个目录到另一个目录后,newerdir的权限和所有者等所有信息会发生变化。挂载后的目录继承了被挂载目录的所有属性,除了名称。Oracle 11g的amm内存管理模式就是使用/dev/shm,所以有时候修改MEMORY_TARGET或者MEMORY_MAX_TARGET会出现ORA-00845的错误
问题30、Linux符号连接的层数过多
ln创建符号链接的时候一定要使用绝对路径, 例如: /usr/local/cxxt/config-tools 需要创建到 /usr/bin/config-tools 如果你当前目录在 cxxt目录下, 执行 ln -s ./config-tools /usr/bin/config-tools 这时候运行 config-tools 符号连接的层数过多
使用ln 命令使用绝对路径就可以了 ln -s /usr/local/cxxt/config-tools /usr/bin/config-tools
ln 命令 用途 : 链接文件。 语法 1>将某个文件链接到一个文件上 ln [ -f | -n] [ -s ] SourceFile [ TargetFile ] 2>将一个或多个文件链接到一个目录上 ln [ -f | -n] [ -s ] SourceFile … TargetDirectory 描述 ln 命令将在 SourceFile 参数中指定的文件链接到在 TargetFile 参数中指定的文件,或将其链接到在 TargetDirectory 参数中指定的另
一个目录中的文件。 在缺省情况下,ln 命令会创建硬链接。如果需要使用 ln 命令来创建符号链接,请指明 -s 标志。
问题31、解决 Log output is incomplete or unavailable 问题
最近遇到一件很奇怪的事情,那就是systemctl status xxx总是无法正常显示journal日记,提示
Warning: Journal has been rotated since unit was started. Log output is incomplete or unavailable.
后来才发现是journalctl这逼给删掉了,journal会统计日记大小,到了某种程度就自动删掉
解决办法很简单
journalctl --vacuum-size=1G
最大可存放1GB journal,搞定了
问题32、使用yumdownloadonly下载RPM包及依赖包
yum install yum-plugin-downloadonly -y
yum install --downloadonly --downloaddir=/tmp/libgudev1 libgudev1
rpm -Uvh --force --nodeps *.rpm
问题33、手工离线安装部署RabbitMQ(redhat 7.3)
手工部署RabbitMQ(CentOS 7.4)_弹性云服务器 ECS_最佳实践_华为云 (huaweicloud.com)
准备依赖包
yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel unixODBC unixODBC-devel httpd python-simplejson
erlang/OTP安装
根据需要安装的rabbitmq版本,查询erlang版本矩阵,进行安装
tar -zxvf otp_src_25.0.1.tar.gz
su root
cp -r otp_src_25.0.1 /usr/local/
cd /usr/local/
mv otp_src_25.0.1/ erlang/
cd erlang
./configure --prefix=/usr/local/erlang --enable-smp-support --enable-threads --enable-sctp --enable-kernel-poll --enable-hipe --with-ssl --without-javac
make && make install
vi /etc/profile
export PATH=$PATH:/usr/local/erlang/bin
source /etc/profile
rabbitmq二进制安装
参考文档Generic Binary Build (“Generic UNIX Build”) — RabbitMQ
上传 rabbitmq-server-generic-unix-3.10.5.tar.xz
tar -Jxvf rabbitmq-server-generic-unix-3.10.5.tar.xz
su root
cp -r rabbitmq_server-3.10.5/ /usr/local/
cd /usr/local/
mv rabbitmq_server-3.10.5/ rabbitmq
# 添加环境变量 PATH
# cd /usr/local/rabbitmq/
vim /etc/profile 添加如下配置:
export RABBITMQ_HOME=/usr/local/rabbitmq
export PATH=$PATH:/usr/local/rabbitmq/sbin
source /etc/profile
【配置 rabbitmq】
# cd /usr/local/rabbitmq/ebin
# vim rabbit.app
找到:{loopback_users, [<<"guest">>]},修改为:{loopback_users, [guest]}
保存退出
【启动 rabbitmq】:
rabbitmq-server -detached
# netstat -tnlp|grep 5672
# rabbitmqctl status
# rabbitmqctl cluster_status -- 状态查看
启用管理插件
# rabbitmq-plugins enable rabbitmq_management
查看防火墙状态,若为开启active (running)状态则关闭防火墙,否则管理页面可能访问不了,或者将对应端口添加到firewalld白名单
# systemctl status firewalld
# systemctl stop firewalld
访问:http://ip_address:15672/,输入用户/密码:guest/guest,如果页面访问登录正常则表明安装成功。
# rabbitmqctl shutdown -- 关闭rabbitmq服务
# 配置文件位置
$RABBITMQ_HOME/etc/rabbitmq/rabbitmq.conf
$RABBITMQ_HOME/etc/rabbitmq/rabbitmq-env.conf
问题34、linux添加环境变量
添加环境变量之前需要明白以下几点:
1、Linux的环境变量是保存在变量PATH中(window 也是保存在PATH中),可通过命令 echo $PATH 输出查看
2、Linux环境变量值之间是通过冒号分隔的( : )
其格式为:PATH=$PATH:<PATH 1>:<PATH 2>:<PATH 3>:——:
临时添加环境变量PATH:
可通过export命令,如
export PATH=/usr/local/nginx/sbin/:$PATH,将/usr/local/nginx/sbin/目录临时添加到环境变量中
当前用户永久添加环境变量:
编辑.bashrc文件 vim ~/.bashrc «—- 通过这种方式,在关闭xshell后,添加的环境变量仍然生效
文件末尾添加:export PATH="/usr/local/nginx/sbin/:$PATH"
source ~/.bashrc
所有用户永久添加环境变量:
编辑/etc/profile文件 vim /etc/profile «—- 通过这种方式,在关闭xshell后,添加的环境变量不生效
文件末尾添加:export PATH="/usr/local/nginx/sbin/:$PATH"
source /etc/profile
总结:
linux添加环境变量注意几点:
1、变量之前使用冒号分隔
2、使用命令export
3、export时,需要有$PATH
4、在文件的末尾添加
5、配置文件有,/etc/profile 和 ~/.bashrc
6、添加bin或者sbin目录即可
问题35、linux的ssh配置,主要防断连
修改服务器中/etc/ssh/sshd_config 文件,
LoginGraceTime=2m
TCPKeepAlive=yes
然后使用service sshd restart来重启sshd服务,这样就可以了。
问题36、vim
1、复制
1)单行复制
在命令模式下,将光标移动到将要复制的行处,按“yy”进行复制;
2)多行复制 在命令模式下,将光标移动到将要复制的首行处,按“nyy”复制n行;其中n为1、2、3……
【yy】 复制光标所在的那一行 【nyy】 复制光标所在的向下n行
2、粘贴
在命令模式下,将光标移动到将要粘贴的行处,按“p”进行粘贴
【p,P】 p为将已经复制的数据在光标下一行粘贴;P为将已经复制的数据在光标上一行粘贴
3、删除
删除一行:dd
删除一个单词/光标之后的单词剩余部分:dw
删除当前字符:x
光标之后的该行部分:d$
文本删除
dd 删除一行
d$ 删除以当前字符开始的一行字符
ndd 删除以当前行开始的n行
dw 删除以当前字符开始的一个字
ndw 删除以当前字符开始的n个字
4、查找
在 normal 模式下按下 /
即可进入查找模式,输入要查找的字符串并按下回车。 Vim 会跳转到第一个匹配。按下 n
查找下一个,按下 N
查找上一个。
Vim 查找支持正则表达式,例如 /vim$
匹配行尾的 "vim"
。 需要查找特殊字符需要转义,例如 /vim\$
匹配 "vim$"
。
注意查找回车应当用
\n
,而替换为回车应当用\r
(相当于<CR>
)。
【/word】 在文件中查找内容为word的字符串(向下查找) 【?word】 在文件中查找内容为word的字符串(向上查找) 【[n]】 表示重复查找动作,即查找下一个 【[N]】 反向查找下一个
搜索后,我们打开别的文件,发现也被高亮了,怎么关闭高亮?
命令模式下,输入:nohlsearch 也可以:set nohlsearch; 当然,可以简写,noh或者set noh。
5、设置行号
如果编辑后,又想显示行号,同样操作按一下esc键,并输入:(冒号),输入set number ,并按回车键,完成后即显示行号
6、跳到指定行
在知道所查找的内容在文件中的具体位置时可以使用以下命令直接定位: 跳到文件指定行:比如跳到66行
66+G(也就是66+shift+g) 当然你可以选择另一种跳转方式:
命令行输入“ : n ” 然后回车 跳到文件第一行:gg (两个小写的G)
跳到文件最后一行:shift+g (也就是G)
7、文件上下翻转
页翻转可以直接使用PgUp和PgDn
向前滚动一屏:Ctrl+F
向后滚动一屏:Ctrl+B
向前滚动半屏:Ctrl+D(向下)
向后滚动半屏:Ctrl+U(向上)
向下滚动一行,保持当前光标不动:Ctrl+E
向上滚动一行,保持当前光标不动:Ctrl+Y
当前行滚动: 当前行移动到屏幕顶部并滚动:Z+Enter 滚动指定行到屏幕顶部: 10Z+Enter(指定第十行) 当前行移动到屏幕中央并滚动:Z + . 当前行移动到屏幕底部并滚动:Z + - 当前屏幕操作: H:大写h,移动到当前屏幕首行;nH移动到首行下的第n行 M:大写m,移动到当前屏幕中间行 L:大写l,移动到当前屏幕末行;nL移动到末行上面的第n行
**8、**撤销上一步操作
【u】 撤消上一个操作 【[Ctrl] + r】 多次撤消 【.】 这是小数点键,重复上一个操作
缩进:
插入模式下,ctrl+shift+d 减少缩进,ctrl+shift+t 增加缩进
9、vim编辑
1、进入插入模式(6个命令) 【i】 从目前光标所在处插入 【I】 从目前光标 【a】 从当前光标所在的下一个字符处开始插入 【A】 从光标所在行的最后一个字符处开始插入 【o】 英文小写字母o,在目前光标所在行的下一行处插入新的一行并开始插入 【O】 英文大写字母O,在目前光标所在行的上一行处插入新的一行并开始插入
2、进入替换模式(2个命令) 【r】 只会替换光标所在的那一个字符一次 【R】 会一直替换光标所在字符,直到按下[ESC]键为止 【[ESC]】 退出编辑模式回到一般模式
3、一般模式切换到命令行模式 【:w】 保存文件 【:w!】 若文件为只读,强制保存文件 【:q】 离开vi 【:q!】 不保存强制离开vi 【:wq】 保存后离开 【:wq!】 强制保存后离开 【:! command】 暂时离开vi到命令行下执行一个命令后的显示结果 【:set nu】 显示行号 【:set nonu】 取消显示行号 【:w newfile】 另存为 【:set fileencoding】 查看当前文件编码格式 【:set fileencoding=utf-8】 设置当前文件编码格式为utf-8,也可以设置成其他编码格式 【:set fileformat】 查看当前文件的断行格式(dos\windows,unix或macintosh) 【:set fileformat=unix】 将当前文件的断行格式设置为unix格式
10、多窗口功能
【:sp [filename]】 打开一个新窗口,显示新文件,若只输入:sp,则两窗口显示同一个文件 【[Ctrl] + w + j】 光标移动到下方窗口 【[Ctrl] + w + k】 光标移动到上方窗口 【[Ctrl] + w + q】 离开当前窗口
11、缩进
批量缩进
在程序代码界面,按esc,退出编辑模式,到命令模式,并在英语输入法下输入“:”
将所要批量缩进的行号写上,按照格式:“行号1,行号2>”输入命令,如要将2至9行批量缩进一个tab值,则命令为“2,9>”
输入完毕后,按回车可以执行,就可以看到2至9行全部缩进了一个tab值了,同样的,如果要缩回来一个tab值,则用命令“行号1,行号2<”即可
可视模式缩进
方法二是在可视模式下选择要移动的列,操作为,esc从编辑模式退到命令模式,将光标移到需要缩进的行的行首,然后按shift+v,可以看到该行已被选中,且左下角提示为“可视”
此时,按键盘上的上下左右方向键,如这里按向下的箭头,选中所有需要批量缩进的行
选择好了之后,按shift+>,是向前缩进一个tab值,按shift+<,则是缩回一个tab值,
12、替换
:s
(substitute)命令用来查找和替换字符串。语法如下:
:{作用范围}s/{目标}/{替换}/{替换标志}
例如 :%s/foo/bar/g
会在全局范围(%
)查找 foo
并替换为 bar
,所有出现都会被替换(g
)。
问题37、安装docker-compose
手动安装
官网选择版本 https://github.com/docker/compose/releases 选择相应版本,下载docker-compose-Linux-x86_64到本地或者服务器中 更名为docker-compose
,并移动到 /usr/local/bin 目录下
添加执行权限
chmod +x /usr/local/bin/docker-compose
检查docker compose版本
docker-compose version
问题38、touch修改文件时间
只能修改当前层级,每一层都得进行修改
# 查看文件时间
stat 文件名
# 修改当前层级所有文件,不能修改其他层级
touch -t 202209210314.32 *
202209210354.16
# 修改 ..
touch -t 202209210314.32 ..
39、安装python
在线
-
在 Debian 的衍生產品,例如 Ubuntu,使用
apt
。$ sudo apt-get install python3
-
在 Red Hat 和衍生產品,請使用
yum
。$ sudo yum install python3
-
在 SUSE 和衍生產品,請使用
zypper
。$ sudo zypper install python3
离线
1.查看当前python环境版本
python --version
**2.**首先安装编译安装时需要的依赖包,编译python源码时,需要一些依赖包,一次安装完毕
yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make libffi-devel
3.根据需要下载对应的Python版本:
服务器下载较慢时,可以在官网下载到本地之后,再上传到服务器。
wget https://www.python.org/ftp/3.7.0/Python-3.7.2.tgz
4.解压python安装包
cd opt
tar -zxvf Python-3.x.tgz
5.新建一个python3的安装目录
#创建编译安装目录
mkdir /usr/local/python3
6.编译安装
cd Python-3.x
./configure --prefix=/usr/local/python3
make && make install
- 创建软连接
ln -s /usr/local/python3/bin/python3 /usr/local/bin/python3
ln -s /usr/local/python3/bin/pip3 /usr/local/bin/pip3
# 验证是否成功
python3 -V
pip3 -V
40、后台进程日志定向输出
后台运行命令 在命令行加上&,表示进程到后台执行,如 cmd & 日志输出重定向命令,如 cmp > out.log & Linux默认定义两个变量:1和2; 1表示标准输出 2表示错误输出 如 cmd 1>info.log 2>error.log & 其中 cmp > out.log & 与 cmp 1> out.log & 是一样的 如果想忽略某个输入,则输出到/dev/null设备即可
如 cmd 1>info.log 2>/dev/null.log &
如果想将2中的日志和1中的日志写入同一个文件,则命令如: cmd 1>info.log 2>&1 & 其中2>&1的&符号表示错误输出重定向到标准输出
但这种后台shell窗口退出ssh登陆或vnc登陆,进程就自动结束,如果想继续运行,请加上 nohup命令 如 nohup cmd 1>info.log 2>&1 &
41、systemctl
systemctl list-units nrcloud-*
systemctl stop nrcloud-*
systemctl disable nrcloud-*
systemctl start nrcloud-*
42、rm 提示 参数列表过长
1、rm -rf * 改为:
find . -name "*" | xargs rm -rf '*' 就行了。
2、rm test* -rf 改为:
find . -name "test*" | xargs rm -rf "test*"
3、如果文件名或文件夹名中有空格使用下列方法
find . -name "today*" -print0 | xargs -0 rm -rf
参数-print0,于默认的-print相比,输出的序列不是以空格分隔,而是以null字符分隔。而xargs也有一个参数-0,可以接受以null而非空格间隔的输入流
43、/tmp目录自动清理
CentOS7下,系统使用systemd管理易变与临时文件,与之相关的系统服务有3个:
systemd-tmpfiles-setup.service :Create Volatile Files and Directories
systemd-tmpfiles-setup-dev.service:Create static device nodes in /dev
systemd-tmpfiles-clean.service :Cleanup of Temporary Directories
配置文件也有3个地方:
/etc/tmpfiles.d/*.conf
/run/tmpfiles.d/*.conf
/usr/lib/tmpfiles.d/*.conf
/tmp目录的清理规则主要取决于/usr/lib/tmpfiles.d/tmp.conf文件的设定,默认的配置内容为:
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.
# See tmpfiles.d(5) for details
# Clear tmp directories separately, to make them easier to override
v /tmp 1777 root root 7d
v /var/tmp 1777 root root 30d
# Exclude namespace mountpoints created with PrivateTmp=yes
x /tmp/systemd-private-%b-*
X /tmp/systemd-private-%b-*/tmp
x /var/tmp/systemd-private-%b-*
X /var/tmp/systemd-private-%b-*/tmp
如你不想让系统自动清理/tmp下以tomcat开头的目录,那么增加下面这条内容到配置文件中即可:
x /tmp/tomcat.*
44、rm 提示 参数列表过长 解决方法
在Linux或者AIX中删除大量文件时,直接用rm * 可能会出现 参数列表过长,的错误。
这时可以用find命令来结合使用。
例:
1、rm -rf *
改为:
find . -name "*" | xargs rm -rf '*'
就行了。
2、rm test* -rf
改为:
find . -name "test*" | xargs rm -rf "test*"
3、如果文件名或文件夹名中有空格使用下列方法
find . -name "today*" -print0 | xargs -0 rm -rf
参数-print0,于默认的-print相比,输出的序列不是以空格分隔,而是以null字符分隔。而xargs也有一个参数-0,可以接受以null而非空格间隔的输入流
45、Linux查看系统开机时间
1:who 命令查看
who -b 查看最后一次系统启动的时间。
who -r 查看当前系统运行时间
2:last reboot命令查看
last reboot可以看到Linux系统历史启动的时间。
last -x | grep shutdown #以关机时间段显示
# 如果只需要查看最后一次Linux系统启动的时间,
last -1 reboot
last reboot | head -1
3:TOP命令查看
up后表示系统到目前运行了多久时间。反过来推算系统重启时间
4:w命令查看
同top
5:uptime 命令查看
6:查看/proc/uptime
cat /proc/uptime
date -d "`cut -f1 -d. /proc/uptime` seconds ago"
date -d "$(awk -F. '{print $1}' /proc/uptime) second ago" +"%Y-%m-%d %H:%M:%S"
46、批量替换文件中内容(perl,sed,shell)
方法1:
这两天在构建一个应用的使用用到了maven,由于project很大,足足有700多个 pom.xml文件,更郁闷的是在很多pom.xml文件里都单独指定了资源库的url,我需要把这些资源库的url统一指定到nexus本地中央库. 手 工一个个改文件配置有点不太实际,所以google了一下,找到批量替换文件内容的好方法,命令结构如下: find -name ‘要查找的文件名’ | xargs perl -pi -e ’s|被替换的字符串|替换后的字符串|g’下面这个例子就是将当前目录及所有子目录下的所有pom.xml文件中的”http://repo1.maven.org/maven2“ 替换为”http://localhost:8081/nexus/content/groups/public“. find -name ‘pom.xml’ | xargs perl -pi -e ’s|http://repo1.maven.org/maven2|http://localhost:8081/nexus/content /groups/public|g’这里用到了Perl语言, perl -pi -e 在Perl 命令中加上-e 选项,后跟一行代码,那它就会像运行一个普通的Perl 脚本那样运行该代码. 从命令行中使用Perl 能够帮助实现一些强大的、实时的转换。认真研究正则表达式,并正确地使用,将会为您省去大量的手工编辑工作。
find -name ‘pom.xml’ | xargs perl -pi -e ’s|http://repo1.maven.org/maven2|http://localhost:8081/nexus/content/groups/public|g’
方法2:
Linux下批量替换多个文件中的字符串的简单方法。用sed命令可以批量替换多个文件中的字符串。
用sed命令可以批量替换多个文件中的 字符串。
sed -i “s/原字符串/新字符串/g” grep 原字符串 -rl 所在目录
例如:我要把mahuinan替换 为huinanma,执行命令:
sed -i “s/mahuinan/huinanma/g” ‘grep mahuinan -rl /www’
这是目前linux最简单的批量替换字符串命令了!
具体格式如下:
sed -i “s/oldString/newString/g” grep oldString -rl /path
实例代码:sed -i “s/大小多少/日月水火/g” grep 大小多少 -rl /usr/aa
sed -i “s/大小多少/日月水火/g” grep 大小多少 -rl ./
方法3:
在日程的开发过程中,可能大家会遇到将某个变量名修改 为另一个变量名的情况,如果这个变量是一个局部变量的话,vi足以胜任,但是如果是某个全局变量的话,并且在很多文件中进行了使用,这个时候使用vi就是 一个不明智的选择。这里给出一个简单的shell命令,可以一次性将所有文件中的指定字符串进行修改:
grep “abc” * -R | awk -F: ‘{print $1}’ | sort | uniq | xargs sed -i ’s/abc/abcde/g’
批量替换 配置文件中的IP:
grep “[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}” * -R | awk -F: ‘{print $1}’ | sort | uniq | xargs sed -i ’s/[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}/172.0.0.1/g’
from: http://blog.zol.com.cn/1395/article_1394052.html
补充说明:
sed -i “s/oldString/newString/g” grep oldString -rl /path
对多个文件的处理可能不支持,需要用 xargs, 搞定。
变种如下:
grepoldString -rl /path | xargssed -i “s/oldString/newString/g”
注意:
在 grep oldString -rl /path
中 为1前边的翻引号
,而不是enter 前的’
47、统计特定开头文件夹的个数
例如查找某目录下以main开头的文件夹个数
find -type d -name "main*" |wc -l
排除特定开头文件夹后的个数,例如排除上级文件夹和当前文件夹和隐藏文件夹,都是以.开头的
find -type d ! -name ".*" |wc -l
查找指定目录文件夹的个数
find /path -type d |wc -l
同样可以实现统计特定文件的个数
find -type f -name "*.txt" |wc -l
自己灵活运用, wc -l统计输出的行数
如果要统计当前目录下和子目录下的文件或者文件夹个数,具体请搜索以下命令
ls -lR|grep "^-"| wc -l