shell工具与服务管理
1,shell工具
定义
shell 单词的本意是“壳子”,在计算机领域一样可以理解为机器外面的一层壳,目的是进行用于人机交互,本质上是命令解释器。只要是人与电脑之间交互的接口,就可以称为 shell。
需要说明的是,常见的概念包括shell脚本,其指的是采用shell语言编写的脚本,可以使用shell程序来进行执行,二者之间的关系可见下图:
shell程序分类
zsh
很多人的 mac 中会使用 zsh 而不是 bash,一大半是因为 oh-my-zsh 这个配置集,它兼容 bash,还有自动补全等好用的功能。
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。
tcsh
tcsh 是 csh 的增强版,加入了命令补全功能,提供了更加强大的语法支持。
ash
ash是一个简单的轻量级的 Shell,占用资源少,适合运行于低内存环境,但是与下面讲到的 bash shell 完全兼容。
bash
bash是基于GUN架构开发的,开发者叫史蒂芬博恩,是BourneAgain Shell的缩写。保持了对 sh shell 的兼容性,是各种 Linux 发行版默认配置的 shell。bash 兼容 sh 意味着,针对 sh 编写的 shell 代码可以不加修改地在 bash 中运行。尽管如此,bash 和 sh 还是有一些不同之处:一方面,bash 扩展了一些命令和参数;另一方面,bash 并不完全和 sh 兼容,它们有些行为并不一致,但在大多数企业运维的情况下区别不大,特殊场景可以使用 bash 代替 sh。
查看shell
在现代的 Linux 上,sh 已经被 bash 代替,/bin/sh往往是指向/bin/bash的符号链接。如果你希望查看当前 Linux或MacOS的默认shell,那么可以输出 shell 环境变量:
$ echo $SHELL
如果想知道自己系统安装了哪些shell,使用如下命令可得到如下所示的信息。
cat /etc/shells
shell配置
如上所说,shell 在启动时都会去找配置文件,然后运行它。你安装的一些脚本,如果想让它能够全局运行,就需要在配置文件中设置路径。有过设置路径后还是不管用的经历吗?多半是因为把配置写在了错误的配置文件里。_ 应该在配置shell(最常见的是配置默认命令)之前,使用 echo $SHELL,确认自己现在用的是什么shell后,再去编辑对应的配置文件 _。
bash和zsh的区别
一句话,二者均是shell的一种,zsh能基本完美兼容bash的命令,并且使用起来更加优雅。由于bash或zsh本质上都是解释器,他们所共同服务的是shell语言,因此在命令语法上基本相同,部分兼容性差异可参考:zsh和bash的兼容性差异。
二者切换:
切换bash: chsh -s /bin/bash
切换zsh: chsh -s /bin/zsh
在终端app的系统偏好设置里手动设置。
在配置文件方面:
bash读取的配置文件:~/.bash_profile文件
zsh读取的配置文件:~/.zshrc文件
当从bash切换为zsh时,如果不想重新配置一遍.zshrc文件,可以__在.zshrc文件中加上source ~/.bash_profile,从而直接从.bash_profile文件读取配置。
shell切换事例
一、查看终端shell是zsh还是bash
命令:echo $0
二、切换成bash
命令: chsh -s /bin/bash
三、切换成zsh
命令: chsh -s /bin/zsh
四、切换过程中提示chsh: no changes made
输入以下两条命令即可完美解决
dscl . -read /Users/$USER/ UserShell
exec su - $USER
五、zsh 和 bash 的环境变量文件
bash 的环境变量文件是.bash_profile。
zsh 的环境变量文件是.zshrc。
六、注意事项
切换完终端模式后记得重启终端才会生效!
2,macOS服务管理
背景
在Mac下没有像Linux那样有很多的关于init方面的工具,从init的发展历史https://en.wikipedia.org/wiki/Init上可以知道,Mac使用的是Launchd作为init管理工具,对应的命令工具为launchctl。
如果在Linux下创建一个自启动服务可以使用Upstart、Systemd、Sysvinit,其中最简单和最古老的方式应该是Sysvinit,毕竟其支持Shell脚本,非常方便。而在Mac下,与Linux的做法不太一样,采用Launchd进行管理,其设置服务采用了plist文件进行对服务来描述,并通过配置好后放在/System/Library/LaunchDaemons
或者/Library/LaunchDaemons,最后通过launchctl命令行使其生效,期间也可以直接通过launchctl来对服务进行操作,比如启动、停止等。
在 Linux 上有一个大家用惯的 systemd,在 MacOS 上有一个与之相对应的工具,launchd。
Linux 下,systemd 的 pid 是 1,系统启动后,它是第一个被拉起来的,其它进程都是它的子进程。所以在 Linux 下,用 systemd 来做 supervisor 是最稳妥的办法。因为如果 systemd 挂掉了,整个系统都 crash 了。
MacOS 下面也有一个这样的超级进程,所有的其它进程都是它产生的,挂为它的子进程、孙子进程…… 它就是 launchd。launchd 对应的管理工具就是 launchctl。
https://www.jianshu.com/p/d6f09bc4142e
launchctl服务管理
launchctl`类似于Linux的`systemd
使用launchctl 添加启动服务
#添加启动服务
sudo launchctl load /Library/LaunchDaemons/com.zerotier.one.plist
#卸载启动服务
sudo launchctl unload /Library/LaunchDaemons/com.zerotier.one.plist
# 查看所有的 plist 服务
launchctl list
# 禁用服务
launchctl disable /Library/LaunchDaemons/com.simonkuang.macos.coredns.plist
# 启用服务
launchctl disable /Library/LaunchDaemons/com.simonkuang.macos.coredns.plist
# 杀死进程(不优雅地杀,直接杀进程)并重启服务。对一些停止响应的服务有效。
launchctl kickstart -k /Library/LaunchDaemons/com.simonkuang.macos.coredns.plist
# 在不修改 Disabled 配置的前提下启动服务
launchctl start /Library/LaunchDaemons/com.simonkuang.macos.coredns.plist
# 在不修改 Disabled 配置的前提下停止服务
launchctl stop /Library/LaunchDaemons/com.simonkuang.macos.coredns.plist
使用brew管理服务
# 启动服务
brew services start zerotier # 启动zerotier服务
# 停止服务
brew services stop zerotier
3,linux服务管理
service和systemctl的区别
在CentOS 7中,service和systemctl都是用于管理系统服务的命令。但它们有一些区别:
配置文件位置不同:service命令使用/etc/init.d/目录下的脚本文件,而systemctl命令使用/lib/systemd/system/目录下的unit文件。
状态信息不同:service命令通过执行脚本来获取服务状态信息,而systemctl命令通过systemd的状态管理功能来获取状态信息。因此,systemctl命令提供了更详细和准确的状态信息。
命令选项不同:service命令只有start、stop、restart、reload等简单选项,而systemctl命令提供了更多的选项,比如enable、disable、status、is-active、is-enabled等。
兼容性不同:一些较老的服务可能只能通过service命令启动或停止,而systemctl命令并不支持。
综上所述,虽然两者都可以用于管理系统服务,但systemctl命令更加强大和灵活,更适合在CentOS 7中使用。
关于service的指令
service <服务名> start – 启动指定的服务
service <服务名> stop – 停止指定的服务
service <服务名> restart – 重启指定的服务
service <服务名> reload – 重新加载指定的服务
service <服务名> status – 查看指定服务的运行状态
service <服务名> enable – 开机启动指定的服务
service <服务名> disable – 禁止开机启动指定的服务
service <服务名> --full-restart – 重启指定的服务,会满足所有配置文件的改动
service --status-all – 列出所有系统中的服务及其状态
service <服务名> configtest – 检查指定的服务的配置文件是否正确
service <服务名> condrestart – 重新启动指定的服务,但只有在该服务已经启动过时才执行
service <服务名> try-restart – 重新启动指定的服务,但在服务没有启动前不执行
service <服务名> reload-or-restart – 尝试通过卸载和重新加载服务来重新启动指定服务
关于systemctl的指令
systemctl start <服务名> – 启动指定的服务
systemctl stop <服务名> – 停止指定的服务
systemctl restart <服务名> – 重启指定的服务
systemctl reload <服务名> – 重新加载指定的服务
systemctl status <服务名> – 查看指定服务的运行状态
systemctl enable <服务名> – 开机启动指定的服务
systemctl disable <服务名> – 禁止开机启动指定的服务
systemctl is-active <服务名> – 判断指定的服务是否正在运行
systemctl is-enabled <服务名> – 判断指定服务是否开启了开机自启
systemctl is-failed <服务名> – 判断指定服务是否启动失败
systemctl mask <服务名> – 锁定指定的服务,禁止所有对它的操作
systemctl unmask <服务名> – 解锁指定的服务
systemctl daemon-reload – 重载 systemctl 守护进程,读取最新的服务配置
systemctl list-units – 查看所有正在运行的服务
systemctl list-unit-files – 查看所有已安装的服务文件
systemctl show <服务名> – 显示指定服务的属性信息
systemctl set-property <服务名> <属性名>=<属性值> – 设置指定服务的属性
systemctl edit <服务名> – 编辑指定服务的配置文件(如果没有则新建一个)
systemctl cat <服务名> – 查看指定服务的配置文件
systemctl kill <服务名> – 关闭指定的服务
systemctl poweroff – 立即关闭系统
systemctl reboot – 立即重启系统
systemctl suspend – 让系统进入睡眠状态
systemctl hibernate – 让系统进入休眠状态
4,包管理工具
Linux系统分为两种
1.RedHat系列:Redhat、Centos、Fedora等
2.Debian系列:Debian、Ubuntu等
RedHat系列的包管理工具是yum
Debian系列的包管理工具是apt-get
查看系统版本:
cat /proc/version
Macos包管理工具
Homebrew
Homebrew的安装
1.打开终端(terminal)
2.安装命令:
命令1:/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"(这个命令不好使会报错,如果报错尝试使用命令2)
命令2:/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"(这是一个脚本,同样可以安装Homebrew)
3.卸载命令:
$ cd `brew --prefix`
$ rm -rf Cellar
$ brew prune
$ rm `git ls-files`
$ rm -r Library/Homebrew Library/Aliases Library/Formula Library/Contributions
$ rm -rf .git
$ rm -rf ~/Library/Caches/Homebrew
Homebrew的使用
1.查看Homebrew命令:brew help
2.安装任意包:brew install ,eg:brew install node
3.卸载任意包:brew uninstall ,eg:brew uninstall git
4.查询可用包:brew search
5.查询已安装包列表:brew list
6.查看任意包信息:brew info
7.更新Homebrew:brew update
8.Homebrew帮助信息:brew -h
8.查看brew版本:brew -v
10.更新brew版本:brew update
11.整理重复语句:open ~/.zshrc -e、open ~/.bash_profile -e
5,命令行工具
定义
什么是命令行工具,其实每一台电脑当中都有命令行工具。命令行工具就是一个操作程序,和其它的电脑应用程序一样。程序的尾部是exe为标志的普通车功能需,并且是32位的程序,比如系统自带的cmd程序就是一个最常用的命令行工具。用户可以通过启动这个程序,在里面输入相关的命令行字符,然后来打开自己想要的程序或者启动一些程序命令。
哪些系统可以使用命令行
知道了什么是命令行,再来看一看哪些电脑系统可以使用命令行工具。其实在任何的操作系统里面,都是可以使用命令行的,无论是Windows、linux、Mac 系统当中,都有相应的命令行工具可以来启动电脑程序和指示,并且每个系统都可以安装适用于这个系统的其它命令行软件,让系统用起来更加方便,而且各种工具正在不断升级和完善当中。
6,xcode
Xcode 是运行在操作系统[Mac OS X](https://baike.baidu.com/item/Mac OS X/470629?fromModule=lemma_inlink)上的集成开发工具(IDE),由Apple Inc开发。Xcode是开发 macOS 和 iOS 应用程序的最快捷的方式。Xcode 具有统一的用户界面设计,编码、测试、调试都在一个简单的窗口内完成。
Xcode内置的常见Command Lines Tool。
Command Line Tool本质是一个命令行工具包,内部有很多有用的工具,如Apple LLVM compiler、Make等等。并且并不是只有开发 Apple 应用程序才需要用到这些工具包,当我们使用Homebrew在安装一些python库或者js库时,都会提示需要Command Line Tool。
下文会对Command Line Tool直接缩写成 CLI,XXX 一般情况是指对应路径地址。
我们在开发者官网 Command Line Tool 对其单独下载,当然每个版本的 Xcode 安装包内也会包含这套工具包。
前置工具
在我来介绍这套工具包其他工具之前,我先来介绍两个工具,我称它们为前置工具,因为有了这两个工具,我们才能更好的使用其他的工具。
xcode-select
这个工具可以帮助我们下载及安装 CLI,比手动下载更便捷。并且还能解决另外问题,就是如果我们装有多个 Xcode,我们在使用 CLI 相关工具时,系统就会不知道该去使用哪个版本或者哪个位置的 CLI,使用这个工具可以帮助我们设置及切换当前默认使用的 CLI。
介绍该工具常见的命令:
xcode-select --install: 安装 CLI,会安装到/Library/Developer/CommandLineTools/
xcode-select -p: 显示当前指定的工具包所在 Xcode 路径
xcode-select -s : 切换默认工具包所在 Xcode 路径
xcode-select -r: 重置工具包所在 Xcode 路径
xcode-select提供了一个环境变量,让你能临时使用其他环境来执行xcode command,env DEVELOPER_DIR=“/Applications/Xcode-beta.app” /usr/bin/xcodebuild
xcode-select 选择路径不是直接选择的 CLI 路径,而是选择所在 Xcode 的路径,继而使用该 Xcode 对应的 CLI,默认情况会选择到该 Xcode 包内包含的 CLI,但是如果我们通过 Xcode Preferences 调整过该 Xcode 对应的 CLI,就会使用调整后的 CLI。
这个工具应该是 Mac 自带的工具,位于/usr/bin/xcode-select,并不是跟随 CLI 工具包一块下载下来的。
xcrun
回想我们过去在使用一些 CLI 命令的时候,会直接在终端上执行xcodebuild …这样的方式,没有指定具体的 CLI 路径,并且我们执行which xcodebuild得到的结果是/usr/bin/xcodebuild。那这个命令是怎么执行到我们通过xcode-select设置的默认 CLI 路径下呢?那就得提到我们马上要介绍的这个工具了 – xcrun。