Bash
- echo ${varName} 输出变量
- varName=varValue 设置变量
- unset varName 取消变量
- varName=${varName}:expendVarValue 扩展变量
- env 查看所有环境变量
- set 查看所有环境变量和自定变量
- export varName 将自定变量变成环境变量,环境变量可以在子程序中调用
- read varName 从键盘读取变量值
- alias,unalias 设置和删除别名
- 在 bash 窗口中设置自定变量和环境变量以及别名只在当前窗口下有效,并不是永久的。所以操作系统提供了配置文件以供打开 bash 时自动设置变量。配置文件的加载分为 login shell 和 non-login shell 。
- login shell:
- /etc/profile
- /etc/bash.bashrc
- /etc/profile.d/*.sh
- /etc/bash.bashrc
- ~/.profile
- ~/.bashrc
- ~/.bashrc
- /etc/profile
- non-login shell:
- ~/.bashrc
实验验证:
- 修改 ~/.bashrc,打开新的 non-login shell : 生效。
- 修改 ~/.profile,打开新的 non-login shell : 未生效,注销重新登录后生效。
- 修改 /etc/profile,打开新的 non-login shell : 未生效,注销重新登录后生效。
- login shell:
程序(process)
- 所有程序在执行时会分配一个 PID 作为唯一标识,程序的权限由它的使用者的权限决定。
- 一个程序执行另一个程序之后,被调用的程序成为子程序。首先子程序会通过复制(fork)的方式复制一个和父程序一模一样的暂存程序(PID不同),然后以 exec 的方式载入实际要执行的程序。
- 诸如 ps 等命令的程序,执行完之后会马上结束。而另一类可以常驻在内存中的程序例如:Apache,vsftpd 等,这些程序称为服务(daemon),这类程序通常会在文件名后面加上d,例如 httpd,vsftpd 等。
- bash 中在前景下执行其他程序时,会执行子程序,而当前的 bash 就会暂停。可以通过工作管理(job control)来实现多个工作同时执行。
- 不需要和使用者互动的程序可以放入背景中执行,方法是在命令之后加上 & 。在背景中执行的程序不能使用 Ctrl + C 终止。但是背景中执行的程序的输出默认会直接输出到屏幕中影响前景中的工作,可以通过数据流重定向来对输出进行设置。
- 使用 Ctrl + Z 可以将目前前景中的工作丢到背景中暂停。
- 使用 jobs [-lrs] 可以查看背景中的全部工作。
- 使用 fg %jobnumber 将背景中的工作拿到前景来处理。
- 使用 bg %jobnumber 可以使背景中暂停的工作在背景中运行。
- 使用 kill -[1/9/15] pid/%jobnumber 来重新加载/强制关闭/安全的结束。
- 在终端中启动的程序,工作管理的背景与终端机是相关的。关闭终端机或者以远程登录的方式离线后,所有的子程序都会关闭,即使是在背景下执行的。可以使用 at 命令将工作放在系统背景而与终端机无关,或者使用 nohup 指令,在离线或者登出系统后继续执行。
- 程序管理:
- ps aux/-l 查看所有系统运行程序/当前bash运行程序。
- top 命令动态观察程序。
- pstree -Aup 查看程序树并列出 PID 和所有者。
- kill -signal PID 向工作程序发送信号。
- 程序优先级调整,在使用 ps -l 命令时,可以看到PRI 和 NI 项,PRI(priority)值越低代表优先级越高。可以通过调整 NI 项来调整程序的优先级:PRI(new) = PRI(old) + NI。使用 nice [-n 数字] command 和 renice [number] PID。
- 系统资源观察
- free 指令观察内存使用情况。
- uptime 观察系统启动时间和工作负载
- netstat 追踪网络或者插线槽
- vmstat 侦测系统资源变化(CPU,内存,磁盘读写等)。
服务管理(daemon)
长期驻守在内存中提供某些服务(service)的程序叫做daemon。比如我们经常在Linux下启停MySQL,Apache2 (在Ubuntu下叫做 Apache2 而在 RHEL下叫做httpd,取决于具体的OS)。通常会在服务名称后面加 d 来表示一个 daemon 服务程序。linux 系统提供了对这些服务统一管理的机制和命令。
早期 System V 的 init 管理行为
早期的启动系统服务的管理方式是 init 脚本程序的处理方式。系统核心第一支调用的程序是 init ,然后 init 去唤起所有的系统所需要的服务,不论是本机服务还是网络服务。我们在网上查找 httpd 的命令还经常能看到 /etc/init.d/apache2 start 的方式。
init 管理机制的特点:
- 服务的启动,关闭,重启,状态观察:/etc/init.d/daemon start|stop|restart|status
- 服务的分类:独立启动模式(服务独立启动常驻内存中,提供本机或者用户服务,反应速度快),总管程序(当用户需要时,有xinetd 和 inetd 这两个总管程序(super daemon) 来唤醒和结束服务,具有一定的延迟)。
- 设置服务默认启动与否需要使用 chkconfig daemon on/off 命令(在 ubuntu 下没有该命令)。
- 如果需要唤醒的某个服务依赖其他服务,需要先手动唤醒依赖的服务。
systemd 服务管理机制
使用 systemd 服务管理机制的优点:
- systemd 平行处理所有服务,加速开机流程。而 init 启动脚本是串行的。
- 所有的管理操作只需要使用 systemctl 命令来处理,而 init 服务管理需要 init,chkconfig,service 等命令结合使用。
- 服务相依性自动检查,即自动唤醒需要依赖的其他服务程序。
- systemd 将服务分成service, socket, target, path,snapshot, timer 等多种不同的类型(type)。
- systemd 将许多 daemon 集合成一个 target 。
- systemd 可以向下兼容 init 启动脚本。
systemd 不能完全取代 init 的不足之处:
- systemd 支持的语法有限,使用 /etc/init.d/deamon 可以自定参数,但是使用systemd 不可以。
- 如果服务启动是直接通过服务自己的命令启动如 Apache2 start ,systemd 无法侦测到该服务从而无法进行管理。
systemd 配置文件的位置:
- /lib/systemd/system/ :每个服务最主要的启动脚本设置。
- /run/systemd/system/ :系统执行过程中所产生的服务脚本,这些脚本的优先序要比 /usr/lib/systemd/system/ 高。
- /etc/systemd/system/ :优先级最高,一般存放低于他优先级的链接文件。
查看本机的配置文件,etc/systemd/system/ 保存的都是链接文件,.wants 目录下保存的任然是链接文件,它的意思是启动该服务后,最好再加上该目录下建议的服务。
查看 /lib/systemd/system/ 下的文件,其中 .d 结尾的目录表示该目录下的文件是该服务的补充文件,如果想要对服务的配置文件进行修改,那么建议在这个目录下进行。如下图所示,在查询 Apache2 服务状态时,有一个 Drop-In 选项,即 .d 目录下的文件插入到配置文件中。
systemd 的 unit 类型分类:
- .service:一般的服务类型,最常见。
- .socket:内部程序数据交换服务 。
- .target:执行环境类型,一群服务的集合。
- .mount,.automount:文件挂载相关的服务。
- .path:侦测特定文件或者目录类型,如打印服务。
- .timer:循环执行的服务。
通过systemctl 管理服务:
- 单一服务的启动停止状态观察 : systemctl [command] unit (command : start/stop/restart/reload/enable/disable/mask/unmask/status/is-active/is-enable)。
- 当前服务的状态: active(running)运行中,active(exited)运行一次后停止,active(waiting)等待如打印,inactive不在运行。
- 服务开机启动情况 : enabled(开机启动),disabled(开机不启动),static(不可以自己启动,由其他服务唤醒) ,mask(已注销,不论如何都不会启动)。
- 查看所有服务 : systemctl [command] [–type=TYPE] [–all] (command : list-units(所有开机启动的服务),list-unit-files(所有服务列表),type=service 可以筛选服务类型)。
- 查询服务相依性 : ystemctl list-dependencies [unit] [–reverse] 。
软件安装
Linux 软件安装有两种方式:源代码手动编译安装,下载预编译的二进制文件直接安装。由于源码安装方式较繁琐,所以一般软件发布方都提供预编译好的安装包。通过 apt 安装软件都是预编译安装。
tarball 安装方式
- 由于每种发行版本的操作系统,函数库的位置及编译方式可能不尽相同,所以源代码手动编译也是值得学习的。
- 使用 gcc 命令编译简单的源文件,gcc 是Linux下的编译套件,可以编译多种语言的源码。
- 使用 make 命令编译复杂的源文件,make 命令执行时会查找目录下的 makefile 文件,该文件记录了如何编译源文件
- tarball 安装建议:
- 源代码建议放置在 /usr/local/src 下。
- 软件安装在 /usr/local/softwareName 下。
- 安装完成后,需要添加 PATH 和 man 路径。