这篇文章是用来记录我使用 Linux 操作系统时常用的一些命令、一些笔记、以及遇到的一些问题的解决方法。Linux 在这里指代 CentOS 和 Ubuntu,因为我目前只使用这两个发行版。
不保证以下操作方法是最佳实践,也不保证内容完整,我将会不定期更新。
文件操作相关
查找指定的文件名
1 | # 全盘查找 |
查看隐藏文件
以.
开头的文件或文件夹是隐藏文件,默认不显示
1 | # 显示所有文件(包含隐藏文件) |
必须有文件的执行
权限,用 ls 命令的时候才能看见文件。如果是 Ubuntu,按 Ctrl+H 就可以显示隐藏文件,再按一次则隐藏。
移动文件
mv file_path new_file_path
# 例如
mv file_a /home/file_a
复制文件
cp file_a file_b
输出文件内容
cat /path/to/file/name
zip unzip
把 mydata.zi p解压到 mydatabak 目录里面
unzip mydata.zip -d mydatabak
批量删除 .DS_Store 文件
删除指定目录下所有的 .DS_Store 文件
1 | sudo find /home/path -name ".DS_Store" -type f -delete |
修改文件的拥有者和权限
修改文件的拥有者
chown [用户名] [文件名]
如果是修改所属的用户组使用 chgrp
修改文件夹的拥有者
chown -R [用户名] [文件夹]
chown -R user /tmp/folder
查看硬盘及内存空间
1 | # 查看内存及swap大小 |
统计文件或目录的个数
1 | # 统计文件夹下文件的个数 |
修改默认编辑器
Ubuntu 默认使用 nano,如果不习惯可以使用这个命令修改
select-editor
用户相关
Linux查看当前系统登录用户、登录日志、登录错误日志
查看当前系统的登录用户
w
who
查看成功登录历史记录
last
查看尝试登录失败的历史记录
lastb
显示每个用户最近一次登录成功的信息
lastlog
Ubuntu 切换到 root
sudo su
Ubuntu 修改 root 密码
sudo passwd root
修改完毕以后,执行 su root 命令时,输入新的 root 密码即可
在 root 下,可以切换到其他用户
su - usernmae
用户创建和删除
创建用户(useradd/adduser):
useradd [所要创建的用户名] -p [加密后的密码]
# 会自动创建目录,会提示设置密码
adduser [所要创建的用户名]
删除用户
userdel [-r] [要删除的用户的名称]
修改用户密码
passwd [用户名]
创建用户,但是不创建 home 目录
useradd -M username
创建用户,创建 home 目录,但是不设置密码
1 | useradd -m username |
用户组管理
添加用户到组里面
usermod -a -G apache username
创建用户组
groupadd developers
Ubuntu Home 目录加密问题
如果在安装 Ubuntu 的时候,选择加密 home 目录,在重启的时候,可能会遇到需要解密 home 目录的问题,这时在 home 目录下的用户名文件夹中,只能看到两个文件。提示要运行 ecryptfs-mount-private
来解密文件
1 | Access-Your-Private-Data.desktop README.txt |
使用方法如下
ecryptfs-mount-private /home/.ecryptfs/your_username/.Private
执行的时候需要输入用户密码,然后文件就会解密了
日志相关
实时显示日志文件,如果日志文件有更新,会自动滚动到文件最后,并实时显示
1 | # 默认查看最新的10行 |
清除登录痕迹
1 | # 清除登录系统失败的记录 |
网络相关
nslookup 指定 DNS 服务器
nslookup example.com 8.8.8.8
查看端口占用情况
netstat -ntlp
网卡配置
1 | # 查看网卡信息 |
使用 socat 实现 TCP 代理,socat 需要通过 apt 安装
socat TCP4-LISTEN:13306,reuseaddr,fork TCP4:192.168.10.5:3306
进程相关
查询指定端口的进程id,如 8108
grep 是搜索,|
是管道,下面命令的意思是将 netstat -ap 的结果作为下一个命令的输入
sudo netstat -ap | grep 8108
或者
sudo ps -aux | grep 8108
杀死指定进程
sudo kill xxx
查看指定用户名启动的进程
ps -u username
指定用户来运行某个程序,当前必须要是 root
sudo -u username ./run.sh
查看当前进程信息,显示完整的命令
ps -ef
使用 ax 和 aux 可以查看详细信息
ps ax | grep uwsgi
ps aux | grep uwsgi
强制杀死进程
pid_num 是进程号
kill -s 9 pid_num
pkill -9 pid_num
强制杀死所有 uwsgi 进程
sudo pkill -f uwsgi -9
查看进程 pid 对应的程序文件路径
http://os.51cto.com/art/201003/186841.htm
进入/proc目录
cd /proc
ps查看所有符合./cmd的进程,找出其对应的进程号
用 ll 命令: ll 进程号
如下显示一个示例:
1 | [root@Cluster1 proc]# ll 22401 |
/proc文件系统下的进程号目录下面的文件镜像了进程的当前运行信息,从中可以看到:
1 | cwd符号链接的就是进程22401的运行目录; |
通过cwd直接进入进程运行目录,通过查看相关信息就可以定位此目录对应那个端口号,以及定位是那个应用才使用此服务程序。这样就获得了Linux进程文件路径了。
查看CPU和内存占用
1 | # CPU占用最多的前10个进程: |
1 | # 按内存占用对进程排序 |
supervisord 使用问题
运行 supervisord 命令出现 unix:///tmp/supervisor.sock no such file
可以选择 结束 supervisord 进程,然后重启;重启后会自动重启 supervisord 管理的进程
# 查看所有运行的进程
ps -A
找到 supervisord 进程,并杀死
kill pid
重启
supervisord
开机自动启动 Supervisord
vim /etc/rc.local
# 添加以下内容
/usr/bin/supervisord -c /etc/supervisord.conf
# 将文件设置为可执行,/etc/rc.local 实际上链接到 /etc/rc.d/rc.local
chmod +x /etc/rc.d/rc.local
SSH 相关
生成 SSH 密钥
ssh-keygen -t rsa -C "your_email@example.com"
在服务器上用 SSH 登录另外一台服务
# -p 后面跟的是端口
ssh 192.168.1.102 -l root -p 22
关机与重启命令
重启命令
1 | 1、reboot |
关机命令
1 | 1、halt 立刻关机 |
Curl
1 | # 强制指定本地端口 |
服务相关
Ubuntu 设置开机启动的服务
sudo systemctl enable nginx
最小化安装完 CentOS 7 之后出现的问题
使用 yum install xx
出现错误 cannot find a valid base url for repo
cd /etc/sysconfig/network-scripts
dmesg | grep eth0
在输出结果的最后一行,发现 eth0
重命名为 eno16777736
,修改这个eth文件
vi /etc/sysconfig/network-scripts/ifcfg-eno16777736
最后一行,设置 onboot=yes
,
配置 DNS
vi /etc/resolve.conf
添加
1 | nameserver 114.114.114.114 |
然后重启网络服务
sudo service network restart
没有ifconfig命令的解决办法
如果没有安装桌面环境,那么 minimal 版本没有 ifconfig 命令,找出哪个包提供了ifconfig命令
yum provides ifconfig
输出中可以看到 net-tools 包提供了 ifconfig 命令
yum install net-tools
安装第三方源(EPEL和RPMForge)
CentOS官方文档声称严重推荐EPEL,不推荐RPMForge,因为RPMForge已经不再被维护了。
EPEL官方网站
http://fedoraproject.org/wiki/EPEL
方法1:
EL7下载地址
http://download.fedoraproject.org/pub/epel/7/x86_64/repoview/epel-release.html
rpm -ivh epel-release-7-5.noarch.rpm
EPEL的repo文件已经在目录/etc/yum.repos.d/下
方法2:
sudo yum install epel-release
防火墙设置及 SELinux 问题
设置防火墙开放端口(iptables)
/sbin/iptables -I INPUT -p tcp --dport 8008 -j ACCEPT
linux 配置好iptables后,重启失效的解决方案
With RHEL 7 / CentOS 7, firewalld was introduced to manage iptables. IMHO, firewalld is more suited for workstations than for server environments.
It is possible to go back to a more classic iptables setup. First, stop and mask the firewalld service:
systemctl stop firewalld
systemctl mask firewalld
Then, install the iptables-services package:
yum install iptables-services
Enable the service at boot-time:
systemctl enable iptables
或者
chkconfig iptables on
Managing the service
systemctl [stop|start|restart] iptables
Saving your firewall rules can be done as follows:
service iptables save
or
/usr/libexec/iptables/iptables.init save
Nginx
安装最新版的 Nginx
可以参考这里
rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
通过 yum 安装
yum install nginx
Nginx permission denied 问题
因为忘记了 selinux 的问题,导致 trouble shooting 耽误了不少时间。
由于[SELinux的问题][2],会导致nginx nginx permission denied 的问题,需要将 selinux 关闭。
查看SELinux状态:
# 如果SELinux status参数为enabled即为开启状态
/usr/sbin/sestatus -v
也可以用 getenforce 这个命令检查
关闭SELinux
# 只是临时关闭(不用重启机器),重启后问题仍然出现
# 设置SELinux 成为permissive模式
setenforce 0
# setenforce 1 # 设置SELinux 成为enforcing模式
永久关闭,需要通过修改配置文件,但是需要重启机器:
vim /etc/selinux/config
将SELINUX=enforcing 改为 SELINUX=disabled,重启机器即可
shutdown -r now
Nginx 权限问题
静态文件没有权限,Nginx 报错 403 forbidden (13: Permission denied)
需要修改相应文件夹的权限,或者把nginx的启动用户由默认的nginx,改成网站拥有者的用户
上传文件问题
上传文件时,比较大的文件,文件数据会暂时存储在 /var/lib/nginx/tmp/
中,必须保证 nginx 的启动用户有该文件夹的权限。(如果不是以 nginx 用户启动的话)
MySQL
安装 MySQL 5.7
rpm -Uvh http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm
# 安装
yum install mysql-community-server mysql-community-devel
#启动
systemctl start mysqld
# MySQL 5.7 会给 root 分配临时密码,可以通过该方法查看
grep 'temporary password' /var/log/mysqld.log
MySQL 操作
mysql命令用户连接数据库。
mysql -h 主机地址 -u 用户名 -p 用户密码 -P port -D database
# 连接本机的数据库
mysql -u root -p
修改数据库的表编码
ALTER TABLE test_table CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8 COLLATE = utf8_general_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8 COLLATE utf8_general_ci;
修改密码
# MySQL 5.7 版本对密码的安全性要求很严格,必须至少包含1个大写字母、1个小写字母、1个数字和1个特殊字符,长度不得小于8个字符。
ALTER USER 'root'@'localhost' IDENTIFIED BY 'p@ssw0rd';
配置 SNMP 服务
Solarwinds 可以使用 SNMP 协议监控服务器的状态。
1 | # 安装 |
为了让 Solarwinds 监控服务器的状态,需要配置这几个东西
1 | # 打开配置文件 |
修改 community
1 | #### |
配置可以查看主机CPU和内存等设备的数据,添加一行数据
1 | # Third, create a view for us to let the group have rights to: |
修改disk checks配置
1 | # disk PATH [MIN=100000] |
其他
修改 hostname
hostname your_hostname
yum update 之后出现的问题
django-celery
使用 Supervisord 来管理 django-celery 的 beat 和 worker 进程,使用了 MySQL 数据库。但是在执行 yum update 之后,在 beat 的日志中出现异常,导致所有的 task 都无法正确执行。应该是由于 yum update 更新了 MySQL,才会出现该问题,而且 beat 进程仍然在运行,只是不停的出现该异常。
1 | OperationalError: (2006, 'MySQL server has gone away') |
重新启动进程后解决
supervisorctl restart all
gitlab-ci-runner
如果 gitlab-ci-runner 有更新或者 docker 有更新,会出现无法连接到 gitlab 进行 clone 代码
1 | fatal: unable to access 'http://gitlab-ci-token:xxxxxx@your_gitlab/webport/fomalhaut.git/': Failed to connect to your_gitlab port 80: Operation timed out |
需要重启 docker
service docker restart
或者重启 gitlab-ci-runnner
gitlab-ci-runner restart