乙巳🐍年

acc8226 的博客

设置日期和时间

liunx 系统中两种时间: 一种是 UTC, 另一种是本地时间,两者区别为时区不同。

查看当前时间 date

1
2
date
2020年 03月 29日 星期日 18:52:32 CST

查看当前时区 date -R

1
2
date -R
Sun, 29 Mar 2020 18:53:41 +0800

查看 UTC 时间 data -u

1
2
date -u
2020年 03月 29日 星期日 10:53:31 UTC

修改日期 data -s

1
2
3
# 使用 data -s
date -s "2018-05-17"
date -s "2020-3-27 11:59:11"
阅读全文 »

Apache ZooKeeper 是一个开发和维护开源服务器的项目,它支持高度可靠的分布式协调。

下载地址

zookeeper-3.4.14 下载地址
https://mirrors.bfsu.edu.cn/apache/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz

遇到过的问题

Zookeeper 3.5 启动时 8080 端口被占用

通过查阅 Zookeeper3.5 的官方文档,发现这是 Zookeeper3.5 的新特性:

1
New in 3.5.0: The AdminServer is an embedded Jetty server that provides an HTTP interface to the four letter word commands. By default, the server is started on port 8080, and commands are issued by going to the URL "/commands/[command name]", e.g., http://localhost:8080/commands/stat. The command response is returned as JSON. Unlike the original protocol, commands are not restricted to four-letter names, and commands can have multiple names; for instance, "stmk" can also be referred to as "set_trace_mask". To view a list of all available commands, point a browser to the URL /commands (e.g., http://localhost:8080/commands). See the AdminServer configuration options for how to change the port and URLs.

这是 Zookeeper AdminServer,默认使用 8080 端口,它的配置属性如下:

我们可以修改在 zoo.cfg 中修改 AdminServer 的端口:

1
admin.serverPort=8888

保存后,再次启动,Zookeeper 启动成功。

这是 zookeeper 自己搞了一个简易应用服务器,可以查看一些信息

listint and issuing commands
http://localhost:8888/commands

阅读全文 »

whoami
要查看当前登录用户的用户名

who am i
表示打开当前伪终端的用户的用户名

创建用户
useradd 只创建用户,创建完了用 passwd xxx 去设置新用户的密码。

修改密码
passwd 命令是 password 这个英语单词的缩写,表示“密码”

删除用户
deluser newname

单单用 deluser 命令,不加参数的话,只会删除用户,但是不会删除在 /home 目录中的用户目录。如果你想要连此用户的家目录也一并删除,可以加上 –remove-home 这个参数,如下:

1
deluser –remove-home newname

创建组
addgroup是 add 和 group 的缩写,add是英语“添加”的意思,group是英语“群组”的意思。所以addgroup命令用于添加一个新的群组。

1
sudo addgroup siatstudent

删除组
delgroup 是 delete 和 group 的缩写,delete 是英语“删除”的意思,group 是英语“群组”的意思。所以 delgroup 命令用于删除一个已存在的群组。

查看组

chmod 命令:修改文件的访问权限

Linux/Unix 的档案调用权限分为三级 : 档案拥有者、群组、其他。利用 chmod 可以藉以控制档案如何被他人所调用。

https://blog.csdn.net/jiandanjinxin/article/details/51920812

总结

su命令 和 su - 命令最大的本质区别就是:前者只是切换了 root 身份,但 Shell 环境仍然是普通用户的 Shell;而后者连用户和 Shell 环境一起切换成 root 身份了。

参考

Shell 变量

使用 declare 命令创建一个变量名为 tmp 的变量:declare tmp

其实也可以不用 declare 预声明一个变量,直接即用即创建,这里只是告诉你 declare 的作用,这在创建其它指定类型的变量(如数组)时会用到。

使用 = 号赋值运算符,将变量 tmp 赋值为 shiyanlou。注意,与其他语言不同的是, Shell 中的赋值操作,= 两边不可以输入空格,否则会报错。

读取变量的值,使用 echo 命令和 $ 符号($ 符号用于表示引用一个变量的值,初学者经常忘记输入)

通常我们会涉及到的变量类型有三种:

当前 Shell 进程私有用户自定义变量,如上面我们创建的 tmp 变量,只在当前 Shell 中有效。
Shell 本身内建的变量。
从自定义变量导出的环境变量。
也有三个与上述三种环境变量相关的命令:set,env,export。这三个命令很相似,都是用于打印环境变量信息,区别在于涉及的变量范围不同。详见下表:

命令说明
set 显示当前 Shell 所有变量,包括其内建环境变量(与 Shell 外观等相关),用户自定义变量及导出的环境变量。
env 显示与当前用户相关的环境变量,还可以让命令在指定环境中运行。
export 显示从 Shell 中导出成环境变量的变量,也能通过它将自定义变量导出为环境变量。

export 小于 env 小于 set

注意:为了与普通变量区分,通常我们习惯将环境变量名设为大写。

永久生效
但是问题来了,当你关机后,或者关闭当前的 shell 之后,环境变量就没了啊。怎么才能让环境变量永久生效呢?

按变量的生存周期来划分,Linux 变量可分为两类:

  • 永久的:需要修改配置文件,变量永久生效;
  • 临时的:使用 export 命令行声明即可,变量在关闭 shell 时失效。

这里介绍两个重要文件 /etc/bashrc(有的 Linux 没有这个文件) 和 /etc/profile ,它们分别存放的是 shell 变量和环境变量。还有要注意区别的是每个用户目录下的一个隐藏文件:

这个 .profile 只对当前用户永久生效。因为它保存在当前用户的 Home 目录下,当切换用户时,工作目录可能一并被切换到对应的目录中,这个文件就无法生效。

创建 shell 脚本文件

一个简单的示例

1
2
3
4
5
6
7
#!/bin/bash

for ((i=0; i<10; i++));do
echo "hello shell"
done

exit 0

为文件添加可执行权限,否则执行会报错没有权限:chmod 755 hello_shell.sh
并执行脚本 ./hello_shell.sh

添加自定义路径到“ PATH ”环境变量, 注意这里一定要使用绝对路径。PATH=$PATH:/home/shiyanlou/mybin

每个用户的 home 目录中有一个 Shell 每次启动时会默认执行一个配置脚本,以初始化环境,包括添加一些用户自定义环境变量等等。实验楼的环境使用的 Shell 是 zsh,它的配置文件是 .zshrc,相应的如果使用的 Shell 是 Bash,则配置文件为 .bashrc。它们在 etc 下还都有一个或多个全局的配置文件,不过我们一般只修改用户目录下的配置文件。Shell 的种类有很多,可以使用 cat /etc/shells 命令查看当前系统已安装的 Shell。

$ echo "PATH=$PATH:/home/shiyanlou/mybin" >> .zshrc
命令中 >> 表示将标准输出以追加的方式重定向到一个文件中,注意前面用到的 > 是以覆盖的方式重定向到一个文件中

修改和删除已有变量

变量的修改有以下几种方式:

变量设置方式 说明
${变量名#匹配字串} 从头向后开始匹配,删除符合匹配字串的最短数据
${变量名##匹配字串} 从头向后开始匹配,删除符合匹配字串的最长数据
${变量名%匹配字串} 从尾向前开始匹配,删除符合匹配字串的最短数据
${变量名%%匹配字串} 从尾向前开始匹配,删除符合匹配字串的最长数据
${变量名/旧的字串/新的字串} 将符合旧字串的第一个字串替换为新的字串
${变量名//旧的字串/新的字串} 将符合旧字串的全部字串替换为新的字串

变量删除
可以使用 unset 命令删除一个环境变量:
$ unset mypath

如何让环境变量立即生效
前面我们在 Shell 中修改了一个配置脚本文件之后(比如 zsh 的配置文件 home 目录下的 .zshrc),每次都要退出终端重新打开甚至重启主机之后其才能生效,很是麻烦,我们可以使用 source 命令来让其立即生效,如:

1
2
cd /home/shiyanlou
source .zshrc

source 命令还有一个别名就是 .,上面的命令如果替换成 . 的方式就该是:
在使用 . 的时候,需要注意与表示当前路径的那个点区分开。
. ./.zshrc

参考

Linux 基础入门(新版)_Linux - 实验楼

通常 Linux 上的软件安装主要有四种方式

  • 在线安装
  • 从磁盘安装软件包
  • 从二进制软件包安装
  • 从源代码编译安装

在不同的 linux 发行版上面在线安装方式会有一些差异包括使用的命令及它们的包管理工具,因为我们的开发环境是基于 ubuntu 的,所以这里我们涉及的在线安装方式将只适用于 ubuntu 发行版,或其它基于 ubuntu 的发行版如国内的 ubuntukylin(优麒麟),ubuntu 又是基于 debian 的发行版,它使用的是 debian 的包管理工具 dpkg,所以一些操作也适用与 debian。而在一些采用其它包管理工具的发行版如 redhat,centos, fedora 等将不适用(redhat 和 centos 使用 rpm)。

比如我们想安装一个软件,名字叫做 w3m(w3m 是一个命令行的简易网页浏览器),那么输入如下命令:

1
sudo apt-get install w3m

APT 是 Advance Packaging Tool(高级包装工具)的缩写,是 Debian 及其派生发行版的软件包管理器,APT 可以自动下载,配置,安装二进制或者源代码格式的软件包,因此简化了 Unix 系统上管理软件的过程。APT 最早被设计成 dpkg 的前端,用来处理 deb 格式的软件包。现在经过 APT-RPM 组织修改,APT 已经可以安装在支持 RPM 的系统管理 RPM 包。这个包管理器包含以 apt- 开头的多个工具,如 apt-get apt-cache apt-cdrom 等,在 Debian 系列的发行版中使用。

当你在执行安装操作时,首先apt-get 工具会在本地的一个数据库中搜索关于 w3m 软件的相关信息,并根据这些信息在相关的服务器上下载软件安装,这里大家可能会一个疑问:既然是在线安装软件,为啥会在本地的数据库中搜索?要解释这个问题就得提到几个名词了:

软件源镜像服务器
软件源
我们需要定期从服务器上下载一个软件包列表,使用 sudo apt-get update 命令来保持本地的软件包列表是最新的(有时你也需要手动执行这个操作,比如更换了软件源),而这个表里会有软件依赖信息的记录,对于软件依赖,我举个例子:我们安装 w3m 软件的时候,而这个软件需要 libgc1c2 这个软件包才能正常工作,这个时候 apt-get 在安装软件的时候会一并替我们安装了,以保证 w3m 能正常的工作。

apt-get 是用于处理 apt 包的公用程序集,我们可以用它来在线安装、卸载和升级软件包等,下面列出一些apt-get包含的常用的一些工具:

工具 说明
install 其后加上软件包名,用于安装一个软件包
update 从软件源镜像服务器上下载/更新用于更新本地软件源的软件包列表
upgrade 升级本地可更新的全部软件包,但存在依赖问题时将不会升级,通常会在更新之前执行一次update
dist-upgrade 解决依赖关系并升级(存在一定危险性)
remove 移除已安装的软件包,包括与被移除软件包有依赖关系的软件包,但不包含软件包的配置文件
autoremove 移除之前被其他软件包依赖,但现在不再被使用的软件包
purge 与 remove 相同,但会完全移除软件包,包含其配置文件
clean 移除下载到本地的已经安装的软件包,默认保存在/var/cache/apt/archives/
autoclean 移除已安装的软件的旧版本软件包
下面是一些 apt-get 常用的参数:

参数 说明
-y 自动回应是否安装软件包的选项,在一些自动化安装脚本中使用这个参数将十分有用
-s 模拟安装
-q 静默安装方式,指定多个q或者-q=#,#表示数字,用于设定静默级别,这在你不想要在安装软件包时屏幕输出过多时很有用
-f 修复损坏的依赖关系
-d 只下载不安装
–reinstall 重新安装已经安装但可能存在问题的软件包
–install-suggests 同时安装 APT 给出的建议安装的软件包

关于安装,如前面演示的一样你只需要执行apt-get install <软件包名>即可,除了这一点,你还应该掌握的是如何重新安装软件包。 很多时候我们需要重新安装一个软件包,比如你的系统被破坏,或者一些错误的配置导致软件无法正常工作。

你可以使用如下方式重新安装:

1
sudo apt-get --reinstall install w3m

另一个你需要掌握的是,如何在不知道软件包完整名的时候进行安装。通常我们是使用Tab键补全软件包名,后面会介绍更好的方法来搜索软件包。有时候你需要同时安装多个软件包,你还可以使用正则表达式匹配软件包名进行批量安装。

卸载软件

如果你现在觉得 w3m 这个软件不合自己的胃口,或者是找到了更好的,你需要卸载它,那么简单!同样是一个命令加回车 sudo apt-get remove w3m ,系统会有一个确认的操作,之后这个软件便“滚蛋了”。

或者,你可以执行

1
2
3
4
5
# 不保留配置文件的移除
sudo apt-get purge w3m
# 或者 sudo apt-get --purge remove
# 移除不再需要的被依赖的软件包
sudo apt-get autoremove

软件搜索

当自己刚知道了一个软件,想下载使用,需要确认软件仓库里面有没有,就需要用到搜索功能了,命令如下:

1
sudo apt-cache search softname1 softname2 softname3……

apt-cache 命令则是针对本地数据进行相关操作的工具,search 顾名思义在本地的数据库中寻找有关softname1``softname2 …… 相关软件的信息。现在我们试试搜索一下之前我们安装的软件 w3m ,如图:

结果显示了 4 个 w3m 相关的软件,并且有相关软件的简介。

关于在线安装的的内容我们就介绍这么多,想了解更多关于 APT 的内容,你可以参考:

三、使用 dpkg

dpkg 是 Debian 软件包管理器的基础,它被伊恩·默多克创建于 1993 年。dpkg 与 RPM 十分相似,同样被用于安装、卸载和供给和 .deb 软件包相关的信息。

dpkg 本身是一个底层的工具。上层的工具,像是 APT,被用于从远程获取软件包以及处理复杂的软件包关系。"dpkg"是"Debian Package"的简写。

我们经常可以在网络上见到以 deb 形式打包的软件包,就需要使用 dpkg 命令来安装。

dpkg 常用参数介绍:

参数 说明
-i 安装指定 deb 包
-R 后面加上目录名,用于安装该目录下的所有 deb 安装包
-r remove,移除某个已安装的软件包
-I 显示deb包文件的信息
-s 显示已安装软件的信息
-S 搜索已安装的软件包
-L 显示已安装软件包的目录信息

我们先使用apt-get加上-d参数只下载不安装,下载 emacs 编辑器的 deb 包:

1
2
sudo apt-get update
sudo apt-get -d install -y emacs

下载完成后,我们可以查看 /var/cache/apt/archives/ 目录下的内容,如下图:

然后我们将第一个 deb 拷贝到 /home/shiyanlou 目录下,并使用dpkg安装

1
2
3
$ cp /var/cache/apt/archives/emacs24_24.5+1-6ubuntu1.1_amd64.deb ~
# 安装之前参看deb包的信息
$ sudo dpkg -I emacs24_24.5+1-6ubuntu1.1_amd64.deb

如你所见,这个包还额外依赖了一些软件包,这意味着,如果主机目前没有这些被依赖的软件包,直接使用 dpkg 安装可能会存在一些问题,因为dpkg并不能为你解决依赖关系。

1
2
# 使用dpkg安装
$ sudo dpkg -i emacs24_24.5+1-6ubuntu1.1_amd64.deb

跟前面预料的一样,这里你可能出现了一些错误:

我们将如何解决这个错误呢?这就要用到 apt-get 了,使用它的 -f 参数了,修复依赖关系的安装

1
2
sudo apt-get update
sudo apt-get -f install -y

没有任何错误,这样我们就安装成功了,然后你可以运行 emacs 程序

从二进制包安装包

二进制包的安装比较简单,我们需要做的只是将从网络上下载的二进制包解压后放到合适的目录,然后将包含可执行的主程序文件的目录添加进 PATH 环境变量即可,如果你不知道该放到什么位置,请重新复习关于 Linux 目录结构的内容。

0%