Linux经验手册

操作手册型经验存档,不定期更新。

解决中文乱码

问题描述:一些包含中文字符的文件,变得全是乱码,无法查看。

  1. 先通过命令看系统是否有好好安装了中文包。locale -a | grep zh_CN
  2. 如果发现其实已经好好的安装了一些中文包了,就可以直接通过修改~/.bash_profile文件去应用这些中文包,比如(具体包名根据上一步看到的选择):

    1
    2
    export LANG="zh_CN.UTF-8"
    export LC_ALL="zh_CN.UTF-8"
  3. 然后通过命令source ~/.bash_profile让配置生效,这样在Shell里就不会看到中文变成乱码。

  4. 可以通过echo $LANG查看配置

任务调度

Linux下任务调度分为两类:系统任务调度和用户任务调度

系统任务调度

  1. 是系统周期性要执行的工作,比如写缓存数据到硬盘、日志清理等
  2. /etc/crontab里保存配置
  3. 配置里前四行用来设置运行时的环境变量:Shell、PATH、EMail、脚本主目录HOME

用户任务调度

  1. 用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。
  2. 所有用户定义的crontab文件都被保存在/var/spool/cron目录中。其文件名与用户名一致。
  3. 和使用者、使用者权限有关的文件:
    1. /etc/cron.deny 该文件中所列用户不允许使用crontab命令
    2. /etc/cron.allow 该文件中所列用户允许使用crontab命令
    3. /var/spool/cron/ 所有用户crontab文件存放的目录,以用户名命名

crontab

  1. crontab命令被用来提交和管理用户需要周期性执行的任务,与Windows操作系统里的“计划任务”类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。
  2. crontab 选项 参数
    1. 选项:
      • -e 编辑定时器
      • -l 列出定时器
      • -r 删除定时器
      • -u<username> 指定要设定计时器的用户名称
    2. 参数:rontab文件,指定包含待执行任务的crontab文件。
  3. 服务命令:
    • /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 加入开机自动启动
  4. 实际操作中需要注意:
    1. 通过crontab -e是可以直接编辑的,保存并且退出后还会提示修改量。并且这样做不用重启服务或重新加载配置。
    2. 要注意被执行文件是否具有可执行权限
    3. 要注意,被执行文件如果在内部有引用其他文件,记得设置路径,因为直接执行那个文件和被crontab执行,其环境是不一样的,所以需要注意路径问题。

crontab文件格式

  1. 用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段
  2. min hour day month week command
    1. min、hour和week都是0开始,week里7和0都是周日
    2. day和month从1开始
    3. 例子:* * * * * command:每分钟执行一次
  3. 特殊字符:
    • * 通配符
    • , 表示一个枚举的范围列表
    • - 表示一个连续的整数范围
    • / 指定时间的间隔频率,比如“*/10”,比如“0-12/2”

用户切换

susu -

  1. su只是切换了root身份,但是Shell环境还是普通用户的Shell
  2. su -切换身份和Shell环境。
    • 通过pwd会发现工作目录已经不再是普通用户的工作目录,而是root的工作目录了
    • 通过echo $PATH也会发现环境变量也变了。
    • 所以其实从当前用户切换到其他用户,最好也是用这个。否则不会读取那个用户的环境配置文件。

Screen

Screen简介

  1. 系统管理员经常需要 SSH 或者 telent 远程登录到 Linux 服务器,经常运行一些需要很长时间才能完成的任务,比如系统备份、ftp 传输等等。通常情况下我们都是为每一个这样的任务开一个远程终端窗口,因为它们执行的时间太长了。必须等待它们执行完毕,在此期间不能关掉窗口或者断开连接,否则这个任务就会被杀掉,一切半途而废了。
  2. Linux screen命令用于多重视窗管理程序。用户可以通过该软件同时连接多个本地或远程的命令行会话,并在其间自由切换。
    • GNU Screen是一款由GNU计划开发的用于命令行终端切换的自由软件
    • GNU Screen可以看作是窗口管理器的命令行界面版本。它提供了统一的管理多个会话的界面和相应的功能。

Screen功能

会话恢复

  1. 只要Screen本身没有终止,在其内部运行的会话都可以恢复。这一点对于远程登录的用户特别有用——即使网络连接中断,用户也不会失去对已经打开的命令行会话的控制。只要再次登录到主机上执行screen -r就可以恢复会话的运行。
  2. 在暂时离开的时候,也可以执行分离命令detach,在保证里面的程序正常运行的情况下让Screen挂起(切换到后台)。这一点和图形界面下的VNC很相似。

多窗口

  1. 在Screen环境下,所有的会话都独立的运行,并拥有各自的编号、输入、输出和窗口缓存。
  2. 用户可以通过快捷键在不同的窗口下切换,并可以自由的重定向各个窗口的输入和输出。
  3. Screen实现了基本的文本操作,如复制粘贴等;还提供了类似滚动条的功能,可以查看窗口状况的历史记录。窗口还可以被分区和命名,还可以监视后台窗口的活动。

会话共享

  1. 可以让一个或多个用户从不同终端多次登录一个会话,并共享会话的所有特性(比如可以看到完全相同的输出)。
  2. 提供了窗口访问权限的机制,可以对窗口进行密码保护。

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作业。

常用的指令

  1. screen -S yourname 新建一个叫yourname的session
  2. screen -ls 列出当前所有的session
  3. screen -r yourname 回到yourname这个session
  4. screen -d yourname 远程detach某个session
  5. screen -d -r yourname 结束当前session并回到yourname这个session

Screen的安装

  1. 流行的Linux发行版通常自带,Mac是没有的
  2. 手动安装可以去GNU Screen的官网找。

Screen的使用

  1. 直接通过命令screen就能启动,但是实际上会给这个会话起一个名字screen -S david
  2. 输入命令后,看起来可能好像什么也没发生,因为会创建一个窗口,并且打开一个系统默认的shell,不过这里多了一些Screen专属的控制指令(见下面的ctrl + )
  3. 也可以直接加入参数,打开指定的程序screen vi david.txt
  4. Screen默认会为窗口命名为编号和窗口中运行程序名的组合
  5. 在每个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
    1. C-a ] -> Paste,把刚刚在 copy mode 里选定的内容粘帖

利用映射让Nginx更好用

  1. 通过Nginx去代理的时候,可能会觉得去改写Nginx的配置很麻烦。因为可能转发的多个地方,其配置其实是完全一样的,但是呢,反向代理的目标,他们在的目录却大同小异,难道要把location/path写好几份来指向各自不同的path吗?
  2. 其实有一个很简单的做法,比如我们把11000这个端口指向某个www文件夹。那么很自然的,这就是这个端口对应的根目录了。
  3. 但是我们的项目也许并不想要都放在这个目录下,而且我们还想要在这个端口下有多个文件夹,怎么办呢?
  4. 比如,我们想要:11000/test对应某个项目,我们就可以在www目录下执行ln -s test <real path>
  5. 这样就可以建立一个映射,www下会有一个test指向某个真实的目录。

linux版本问题

version和distribution

  1. 这两者是不一样的,前者是核心版本,后者是发行商版本
  2. 比如我们在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
  3. 以上,linux的核心版本是3.10那段,而发行商是Red Hat,版本是4.8.-16
  4. 各种distribution用的都是linux的核心(可能版本不同)但是自己的软件和工具就会有差异了,所以一定要分清自己的linux是什么发行版的。
  5. 值得放心的是,有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

  1. 这个命令会尝试解释它后面的命令的含义
  2. 使用方法很简单whatis <command>然后回车,就会尝试给出指导。
  3. 适用于了解简单命令的大概含义

通过man

  1. man <command>可以显示出需要了解的命令的详细参数和解释
  2. 也可以在命令后增加参数--help来看

Linux的命令语法

  1. 基本上都是这个样子:[sudo] program [parameter]...[parameter] [-flag] [parameter]...[-flag] [parameter]
  2. sudo可以为命令增加root权限
  3. program是程序的名字,比如yumcpfirefox
  4. 在program的参数,根据命令,会有不同的意义,具体就要参考帮助了。

Linux文件操作

scp命令的权限问题

  1. 使用scp传送文件的话,是需要登录的
  2. 使用什么身份登录,目标服务器上被传送来的文件,就是那个身份的权限。

查看文件内容

  • 查看前几行: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的启动参数中。
    1. 系统要求 CentOS 7 以上,Docker 1.9 以上。
      sudo cp -n /lib/systemd/system/docker.service /etc/systemd/system/docker.service
    2. 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
    3. 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

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
    6
    echo "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