操作手册型经验存档,不定期更新。
解决中文乱码
问题描述:一些包含中文字符的文件,变得全是乱码,无法查看。
- 先通过命令看系统是否有好好安装了中文包。
locale -a | grep zh_CN
如果发现其实已经好好的安装了一些中文包了,就可以直接通过修改
~/.bash_profile
文件去应用这些中文包,比如(具体包名根据上一步看到的选择):1
2export LANG="zh_CN.UTF-8"
export LC_ALL="zh_CN.UTF-8"然后通过命令
source ~/.bash_profile
让配置生效,这样在Shell里就不会看到中文变成乱码。- 可以通过
echo $LANG
查看配置
任务调度
Linux下任务调度分为两类:系统任务调度和用户任务调度
系统任务调度
- 是系统周期性要执行的工作,比如写缓存数据到硬盘、日志清理等
- 在
/etc/crontab
里保存配置 - 配置里前四行用来设置运行时的环境变量:Shell、PATH、EMail、脚本主目录HOME
用户任务调度
- 用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。
- 所有用户定义的crontab文件都被保存在
/var/spool/cron
目录中。其文件名与用户名一致。 - 和使用者、使用者权限有关的文件:
- /etc/cron.deny 该文件中所列用户不允许使用crontab命令
- /etc/cron.allow 该文件中所列用户允许使用crontab命令
- /var/spool/cron/ 所有用户crontab文件存放的目录,以用户名命名
crontab
- crontab命令被用来提交和管理用户需要周期性执行的任务,与Windows操作系统里的“计划任务”类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。
crontab 选项 参数
- 选项:
-e
编辑定时器-l
列出定时器-r
删除定时器-u<username>
指定要设定计时器的用户名称
- 参数:rontab文件,指定包含待执行任务的crontab文件。
- 选项:
- 服务命令:
/sbin/service crond start
启动服务/sbin/service crond stop
关闭服务/sbin/service crond restart
重启服务/sbin/service crond reload
重新载入配置service crond status
查看服务状态ntsysv
查看crontab服务是否已设置为开机启动chkconfig –level 35 crond on
加入开机自动启动
- 实际操作中需要注意:
- 通过
crontab -e
是可以直接编辑的,保存并且退出后还会提示修改量。并且这样做不用重启服务或重新加载配置。 - 要注意被执行文件是否具有可执行权限
- 要注意,被执行文件如果在内部有引用其他文件,记得设置路径,因为直接执行那个文件和被crontab执行,其环境是不一样的,所以需要注意路径问题。
- 通过
crontab文件格式
- 用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段
min hour day month week command
- min、hour和week都是0开始,week里7和0都是周日
- day和month从1开始
- 例子:
* * * * * command
:每分钟执行一次
- 特殊字符:
*
通配符,
表示一个枚举的范围列表-
表示一个连续的整数范围/
指定时间的间隔频率,比如“*/10”,比如“0-12/2”
用户切换
su
和su -
su
只是切换了root身份,但是Shell环境还是普通用户的Shellsu -
切换身份和Shell环境。- 通过
pwd
会发现工作目录已经不再是普通用户的工作目录,而是root的工作目录了 - 通过
echo $PATH
也会发现环境变量也变了。 - 所以其实从当前用户切换到其他用户,最好也是用这个。否则不会读取那个用户的环境配置文件。
- 通过
Screen
Screen简介
- 系统管理员经常需要 SSH 或者 telent 远程登录到 Linux 服务器,经常运行一些需要很长时间才能完成的任务,比如系统备份、ftp 传输等等。通常情况下我们都是为每一个这样的任务开一个远程终端窗口,因为它们执行的时间太长了。必须等待它们执行完毕,在此期间不能关掉窗口或者断开连接,否则这个任务就会被杀掉,一切半途而废了。
- Linux screen命令用于多重视窗管理程序。用户可以通过该软件同时连接多个本地或远程的命令行会话,并在其间自由切换。
- GNU Screen是一款由GNU计划开发的用于命令行终端切换的自由软件
- GNU Screen可以看作是窗口管理器的命令行界面版本。它提供了统一的管理多个会话的界面和相应的功能。
Screen功能
会话恢复
- 只要Screen本身没有终止,在其内部运行的会话都可以恢复。这一点对于远程登录的用户特别有用——即使网络连接中断,用户也不会失去对已经打开的命令行会话的控制。只要再次登录到主机上执行
screen -r
就可以恢复会话的运行。 - 在暂时离开的时候,也可以执行分离命令
detach
,在保证里面的程序正常运行的情况下让Screen挂起(切换到后台)。这一点和图形界面下的VNC很相似。
多窗口
- 在Screen环境下,所有的会话都独立的运行,并拥有各自的编号、输入、输出和窗口缓存。
- 用户可以通过快捷键在不同的窗口下切换,并可以自由的重定向各个窗口的输入和输出。
- Screen实现了基本的文本操作,如复制粘贴等;还提供了类似滚动条的功能,可以查看窗口状况的历史记录。窗口还可以被分区和命名,还可以监视后台窗口的活动。
会话共享
- 可以让一个或多个用户从不同终端多次登录一个会话,并共享会话的所有特性(比如可以看到完全相同的输出)。
- 提供了窗口访问权限的机制,可以对窗口进行密码保护。
Screen语法
Screen语法列表
screen [-AmRvx -ls -wipe][-d <作业名称>][-h <行数>][-r <作业名称>][-s ][-S <作业名称>]
- -A 将所有的视窗都调整为目前终端机的大小。
- -d <作业名称> 将指定的screen作业离线。
- -h <行数> 指定视窗的缓冲区行数。
- -m 即使目前已在作业中的screen作业,仍强制建立新的screen作业。
- -r <作业名称> 恢复离线的screen作业。
- -R 先试图恢复离线的作业。若找不到离线的作业,即建立新的screen作业。
- -s 指定建立新视窗时,所要执行的shell。
- -S <作业名称> 指定screen作业的名称。
- -v 显示版本信息。
- -x 恢复之前离线的screen作业。
- -ls或–list 显示目前所有的screen作业。
- -wipe 检查目前所有的screen作业,并删除已经无法使用的screen作业。
常用的指令
- screen -S yourname 新建一个叫yourname的session
- screen -ls 列出当前所有的session
- screen -r yourname 回到yourname这个session
- screen -d yourname 远程detach某个session
- screen -d -r yourname 结束当前session并回到yourname这个session
Screen的安装
- 流行的Linux发行版通常自带,Mac是没有的
- 手动安装可以去GNU Screen的官网找。
Screen的使用
- 直接通过命令
screen
就能启动,但是实际上会给这个会话起一个名字screen -S david
- 输入命令后,看起来可能好像什么也没发生,因为会创建一个窗口,并且打开一个系统默认的shell,不过这里多了一些Screen专属的控制指令(见下面的ctrl + )
- 也可以直接加入参数,打开指定的程序
screen vi david.txt
- Screen默认会为窗口命名为编号和窗口中运行程序名的组合
- 在每个screen session 下,所有命令都以 ctrl+a(以下简写为
C-a
) 开始——意思是你先按一下ctrl + 某个按键
然后放开,再按别的。- C-a ? 显示所有键绑定信息
- C-a c 创建一个新的运行shell的窗口并切换到该窗口
- C-a n Next,切换到下一个 window
- C-a p Previous,切换到前一个 window
- C-a 0..9 切换到第 0..9 个 window
- Ctrl+a [Space] 由视窗0循序切换到视窗9
- C-a C-a 在两个最近使用的 window 间切换
- C-a x 锁住当前的 window,需用用户密码解锁
- C-a d detach,暂时离开当前session,将目前的 screen session (可能含有多个 windows) 丢到后台执行,并会回到还没进 screen 时的状态,此时在 screen session 里,每个 window 内运行的 process (无论是前台/后台)都在继续执行,即使 logout 也不影响。
- C-a z 把当前session放到后台执行,用 shell 的 fg 命令则可回去。
- C-a w 显示所有窗口列表
- C-a t Time,显示当前时间,和系统的 load
- C-a k kill window,强行关闭当前的 window
- C-a [ 进入 copy mode,在 copy mode 下可以回滚、搜索、复制就像用使用 vi 一样,进入模式后可以有操作:
- C-b Backward,PageUp
- C-f Forward,PageDown
- H High,将光标移至左上角
- L Low,将光标移至左下角
- 0 移到行首
- $ 行末
- w forward one word,以字为单位往前移
- b backward one word,以字为单位往后移
- Space 第一次按为标记区起点,第二次按为终点
- Esc 结束并退出 copy mode
- C-a ] -> Paste,把刚刚在 copy mode 里选定的内容粘帖
利用映射让Nginx更好用
- 通过Nginx去代理的时候,可能会觉得去改写Nginx的配置很麻烦。因为可能转发的多个地方,其配置其实是完全一样的,但是呢,反向代理的目标,他们在的目录却大同小异,难道要把
location
、/path
写好几份来指向各自不同的path吗? - 其实有一个很简单的做法,比如我们把
11000
这个端口指向某个www
文件夹。那么很自然的,这就是这个端口对应的根目录了。 - 但是我们的项目也许并不想要都放在这个目录下,而且我们还想要在这个端口下有多个文件夹,怎么办呢?
- 比如,我们想要
:11000/test
对应某个项目,我们就可以在www
目录下执行ln -s test <real path>
- 这样就可以建立一个映射,www下会有一个test指向某个真实的目录。
linux版本问题
version和distribution
- 这两者是不一样的,前者是核心版本,后者是发行商版本
- 比如我们在linux里通过
cat /proc/version
(这个命令不一定能得到结果),得到了结果:Linux version 3.10.0-693.21.1.el7.x86_64 (builder@kbuilder.dev.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC) ) #1 SMP Wed Mar 7 19:03:37 UTC 2018
- 以上,linux的核心版本是3.10那段,而发行商是Red Hat,版本是4.8.-16
- 各种distribution用的都是linux的核心(可能版本不同)但是自己的软件和工具就会有差异了,所以一定要分清自己的linux是什么发行版的。
- 值得放心的是,有
Linux Standard Base(LSB)
等标准来规范开发者,所以不同的distribution其实不会有太大的差异。
发行商的大致情况
公司类型 | rpm机制 | dpkg机制 | emerge |
---|---|---|---|
商业公司 | Red Hat、Micro Focus | Ubuntu | |
团体 | Fedora、CentOS、OpenSuSE | Debian、B2D | Gentoo |
命令 | yum | apt-get |
在Linux里安装应用程序
不同版本的Linux其实安装程序略有不同
- redhat,程序都是
rpm
格式的,通过yum
管理软件 - debian,自然是
deb
格式,通过apt-get
管理软件
一些小建议
根据《鸟哥的Linux私房菜》的推荐,选择rpm软件管理的distribution开始学习会更合适,因为比如CentOS、Red Hat都有比较多的用户,所以能得到更多的技术支持。另外,其实rpm
就是RedHat Package Manager
自学Linux命令的一些窍门
系统自带每天一命令
在~/.bashrc
里增加一行代码:echo "Did you know that: "; whatis$(ls /bin | shuf -n 1)
通过whatis
- 这个命令会尝试解释它后面的命令的含义
- 使用方法很简单
whatis <command>
然后回车,就会尝试给出指导。 - 适用于了解简单命令的大概含义
通过man
man <command>
可以显示出需要了解的命令的详细参数和解释- 也可以在命令后增加参数
--help
来看
Linux的命令语法
- 基本上都是这个样子:
[sudo] program [parameter]...[parameter] [-flag] [parameter]...[-flag] [parameter]
- sudo可以为命令增加root权限
- program是程序的名字,比如
yum
、cp
、firefox
- 在program的参数,根据命令,会有不同的意义,具体就要参考帮助了。
Linux文件操作
scp命令的权限问题
- 使用scp传送文件的话,是需要登录的
- 使用什么身份登录,目标服务器上被传送来的文件,就是那个身份的权限。
查看文件内容
- 查看前几行:
head -n <行数> path/file.name
- 查看末几行:
tail -n <行数> path/file.name
- 查看某几行:
sed -n '<start>, <end>[function]' path/file.name
,注意,这里可以增加参数function,比如p就是简单的print出来,但是其实这个命令功能很强大的。 - 加戏,可以输出到文件里:
head -n <行数> path/file.name >> path/writehere.file
Docker添加阿里镜像加速
FIXME: 以下内容需要更多实践验证。先作为记录。
CentOS —- 安装/升级你的Docker客户端
- 可以通过阿里云的镜像仓库下载:
mirrors.aliyun.com/help/docker-engine
;或执行命令:curl -sSL http://acs-public-mirror.oss-cn- ... ker-engine/internet | sh -
- 使用Docker加速器针对Docker客户端版本 > 1.10的用户:可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器:
sudo mkdir -p /etc/dockersudo tee /etc/docker/daemon.json <<-'EOF'{ "registry-mirrors": ["https://mlz5oe27.mirror.aliyuncs.com"]}EOFsudo systemctl daemon-reloadsudo systemctl restart
- Docker针对Docker客户的版本 <= 1.10的用户,或者想配置启动参数,可以使用下面的命令将配置添加到docker daemon的启动参数中。
- 系统要求 CentOS 7 以上,Docker 1.9 以上。
sudo cp -n /lib/systemd/system/docker.service /etc/systemd/system/docker.service
- Docker 1.12 以下版本使用 docker daemon 命令
sudo sed -i "s|ExecStart=/usr/bin/docker daemon|ExecStart=/usr/bin/docker daemon --registry-mirror=https://qxx96o44.mirror.aliyuncs.com|g" /etc/systemd/system/docker.service
- Docker 1.12 及以上版本使用 dockerd 命令
sudo sed -i "s|ExecStart=/usr/bin/dockerd|ExecStart=/usr/bin/dockerd --registry-mirror=https://qxx96o44.mirror.aliyuncs.com|g" /etc/systemd/system/docker.service
sudo systemctl daemon-reload
sudo service docker restar
- 系统要求 CentOS 7 以上,Docker 1.9 以上。
Ubuntu安装/升级你的Docker客户端
- 推荐安装1.6.0以上版本的Docker客户端,可以通过阿里云的镜像仓库下载:
mirrors.aliyun.com/help/docker-engine
或执行以下命令:curl -sSL [下载地址] | sh -
- 针对Docker客户端版本 > 1.10的用户(使用Docker加速器):可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器:
sudo mkdir -p /etc/dockersudo tee /etc/docker/daemon.json <<-'EOF'{ "registry-mirrors": ["https://mlz5oe27.mirror.aliyuncs.com"]}EOFsudo systemctl daemon-reloadsudo systemctl restart docker
针对Docker客户的版本 <= 1.10的用户,或者想配置启动参数,可以使用下面的命令将配置添加到docker daemon的启动参数中。比如Ubuntu 12.04 14.04的用户:
1
2
3
4
5
6echo "DOCKER_OPTS=\"\$DOCKER_OPTS --registry-mirror=https://mlz5oe27.mirror.aliyuncs.com\"" | sudo tee -a /etc/default/dockersudo service docker restartUbuntu 15.04 16.04的用户sudo mkdir -p /etc/systemd/system/docker.service.d
sudo tee /etc/systemd/system/docker.service.d/mirror.conf <<-'EOF'
[Service]
ExecStart=/usr/bin/docker daemon -H fd:// --registry-mirror=https://mlz5oe27.mirror.aliyuncs.com
EOF
sudo systemctl daemon-reload