shell相关知识1

Linux138

组命令,就是将多个命令划分为一组,或者看成一个整体。

用法区别

Shell 组命令的写法有两种:

{ command1; command2;. . .; }
(command1; command2;. . . )

两种写法的重要不同: {} 包围的组命令在当前 Shell 进程中执行,由 () 包围的组命令会创建一个子Shell,所有命令都会在这个子 Shell 中执行
在子 Shell 中执行意味着,运行环境被复制给了一个新的 shell 进程,当这个子 Shell 退出时,新的进程也会被销毁,环境副本也会消失,所以在子 Shell 环境中的任何更改都会消失(包括给变量赋值)。因此,在大多数情况下,除非脚本要求一个子 Shell,否则 使用 {} 比使用 () 更受欢迎,并且 {} 的进行速度更快,占用的内存更少

举栗 将多条命令的输出重定向到out.txt文件

1.普通模式

2.使用组命令

{ ls -l ;echo "test432";cat test .txt; }>out.txt

(ls -l ;echo "test432";cat test .txt)>out.txt

组命令与管道结合

(ls -l ;echo "test432";cat ../test.txt)|wc -l

子进程的概念是由父进程的概念引申而来的。在 Linux 系统中,系统运行的应用程序几乎都是从 init(pid为 1 的进程)进程派生而来的,所有这些应用程序都可以视为 init 进程的子进程,而 init 则为它们的父进程。

Shell 脚本是从上至下、从左至右依次执行的,即执行完一个命令之后再执行下一个。 如果在 Shell 脚本中遇到子脚本(即脚本嵌套,但是必须以新进程的方式运行)或者外部命令,就会向系统内核申请创建一个新的进程,以便在该进程中执行子脚本或者外部命令,这个新的进程就是子进程。子进程执行完毕后才能回到父进程,才能继续执行父脚本中后续的命令及语句。

使用 pstree -p命令就可以看到 init 及系统中其他进程的进程树信息(包括 pid):

systemd(1)─┬─ModemManager(796)─┬─{ModemManager}(821)
            │                     └─{ModemManager}(882)
            ├─NetworkManager(975)─┬─{NetworkManager}(1061)
            │                       └─{NetworkManager}(1077)
            ├─abrt-watch-log(774)
            ├─abrt-watch-log(776)
            ├─abrtd(773)
            ├─accounts-daemon(806)─┬─{accounts-daemon}(839)
            │                        └─{accounts-daemon}(883)
            ├─alsactl(768)
            ├─at-spi-bus-laun(1954)─┬─dbus-daemon(1958)───{dbus-daemon}(1960)
            │                         ├─{at-spi-bus-laun}(1955)
            │                         ├─{at-spi-bus-laun}(1957)
            │                         └─{at-spi-bus-laun}(1959)
            ├─at-spi2-registr(1962)───{at-spi2-registr}(1965)
            ├─atd(842)
            ├─auditd(739)─┬─audispd(753)─┬─sedispatch(757)
            │               │                └─{audispd}(759)
            │               └─{auditd}(752)

创建子进程的方式说明

  • 第一种只使用 fork() 函数,子进程和父进程几乎是一模一样的,父进程中的函数、变量(全局变量、局部变量)、文件描述符、别名等在子进程中仍然有效。我们将这种子进程称为 *子 Shell(sub shell)

  • 第二种使用 fork() 和 exec() 函数,即使用 fork()创建子进程后立即调用 exec() 函数加载新的可执行文件,而不使用从父进程继承来的一切,子进程和父进程之间除了硬生生地维持一种"父子关系"外,再也没有任何联系了,它们就是两个完全不同的程序。

举栗:
在 ~/bin 目录下有两个可执行文件分别叫 a.out 和 b.out。现在运行 a.out,就会产生一个进程,比如叫做 A。在进程 A 中我又调用 fork() 函数创建了一个进程 B,那么 B 就是 A 的子进程,此时它们是一模一样的。但是,我调用 fork() 后立即又调用 exec() 去加载 b.out,这可就坏事了,B 进程中的一切(包括代码、数据、堆栈等)都会被销毁,然后再根据 b.out 重建建立一切。这样一折腾,B 进程除了 ID 没有变,其它的都变了,再也没有属于 A 的东西了。

子 Shell 虽然能使用父 Shell 的的一切,但是如果子 Shell 对数据做了修改,比如修改了全局变量,这种修改也只能停留在子 Shell,无法传递给父 Shell。 不管是子进程还是子 Shell,都是"传子不传父"。

子 Shell 才是真正继承了父进程的一切,这才像"一个模子刻出来的";普通子进程和父进程是完全不同的两个程序,只是维持着父子关系而已。

echo $$输出当前进程ID,echo $PPID输出父shell ID

输出当前进程与父进程ID

echo $$;echo $PPID

34451

34450

子进程形式输出进程ID

子进程

bash

echo $$;echo $PPID

exit

52886

34451

在普通的子进程中,$ 被展开为子进程的 ID

组命令形式输出进程ID

子shell

(echo $$;echo $PPID)

34451

34450

子shell和父shell中的ID是一样的

这是因为$ 变量在子 Shell 中无效!Base 官方文档说,在普通的子进程中,$ 确实被展开为子进程的 ID;但是在 子 Shell 中,$ 却被展开成父进程的 ID

管道形式输出进程ID

子shell

echo "test" | { echo $$;echo $PPID; }

34451

34450

进程替换形式输出进程ID

read <

Original: https://www.cnblogs.com/saolv/p/13197549.html
Author: 扫驴
Title: shell相关知识1



相关阅读1

Title: Redis 三种集群策略

Redis 是单线程的,但是一般的作为缓存使用的话,速度已经足够使用。
官方有一个简单测试:测试完成 50 个并发执行 100000 个请求,设置和获取的值是一个 256 字节字符串。结果:读的速度 110000次/s,写的速度81000次/s。

不过对于访问量特别大的服务来说,还是稍有不足。这时就需要考虑搭建集群。

Redis 主要提供三种集群策略

在主从复制中,数据库分为俩类,主数据库(master)和从数据库(slave)。

主从复制特点:

工作机制

主从配置

Redis 默认是主数据,所以 Master 无需配置,只需要修改 Slave 的配置即可。
设置需要连接的 Master 的ip端口

如果 Master 设置了密码。需要配置:

连接成功进入命令行后,可以通过以下命令行查看连接该数据库的其他库信息:

该模式是从 Redis 的 2.6 版本开始提供的,但是当时这个版本的模式是不稳定的,直到 Redis 的 2.8 版本以后,这个哨兵模式才稳定下来,无论是主从模式,还是哨兵模式,这两个模式都有一个问题,不能水平扩容,并且这两个模式的高可用特性都会受到Master主节点内存的限制。

哨兵的作用

监控 Redis 系统的运行状况,功能如下

工作机制

哨兵配置

哨兵配置的配置文件为sentinel.conf,设置主机名称,地址,端口,以及选举票数即恢复时最少需要几个哨兵节点同意。只要配置需要监控的master就可以了,哨兵会监控连接该master的slave。

启动哨兵节点

可以在任何一台服务器上查看指定哨兵节点信息:

控制台输出哨兵信息

3.0 版本之前的 Redis 是不支持集群的,那个时候,Redis 如果想要集群的话,就需要一个中间件,然后这个中间件负责将需要存入 Redis 中的数据的 key 通过一套算法计算得出一个值。然后根据这个值找到对应的 Redis 节点,将这些数据存在这个 Redis 的节点中。在取值的时候,同样先将 key 进行计算,得到对应的值,然后就去找对应的 Redis 节点,从对应的节点中取出对应的值。

这样做有很多不好的地方,比如说计算都需要在系统中去进行,会增加系统的负担。还有就是这种集群模式下,某个节点挂掉,其他的节点无法知道。而且也不容易对每个节点进行负载均衡。

从 Redis 3.0版本开始支持 redis-cluster 集群。redis-cluster 采用无中心结构,每一个节点都保存有这个集群所有主节点以及从节点的信息,及集群状态,每个节点都和其他节点连接。所以 redis-cluster 是一种服务端分片技术。

一、twemproxy 中间件

twemproxy 又称 nutcracker,起源于推特系统中 redis、memcached 集群的轻量级代理。

Redis 代理中间件 twemproxy 是一种利用中间件做分片的技术。twemproxy 处于客户端和服务器的中间,将客户端发来的请求,进行一定的处理后(sharding),再转发给后端真正的 redis 服务器。也就是说,客户端不直接访问redis服务器,而是通过t wemproxy 代理中间件间接访问。降低了客户端直连后端服务器的连接数量,并且支持服务器集群水平扩展。

twemproxy 中间件的内部处理是无状态的,它本身可以很轻松地集群,这样可以避免单点压力或故障。

twemproxy 是一个单点,很容易对其造成很大的压力,所以通常会结合 keepalived 来实现 twemproy 的高可用。这时,通常只有一台 twemproxy 在工作,另外一台处于备机,当一台挂掉以后,vip 自动漂移,备机接替工作。关于 keepalived 的用法可自行网上查阅资料。

二、codis 中间件
codis 是一个分布式的 Redis 解决方案,由豌豆荚开源,对于上层的应用来说,连接 codis proxy 和连接原生的 redis server 没什么明显的区别,上层应用可以像使用单机的 redis 一样使用,codis底 层会处理请求的转发,不停机的数据迁移等工作,所有后边的事情,对于前面的客户端来说是透明的,可以简单的认为后边连接的是一个内存无限大的 redis 服务。

客户端分片

分区的逻辑在客户端实现,由客户端自己选择请求到哪个节点。方案可参考一致性哈希,这种方案通常适用于用户对客户端的行为有完全控制能力的场景。

三、Jedis sharding集群
Redis Sharding 可以说是在 Redis cluster 出来之前业界普遍的采用方式,其主要思想是采用 hash 算法将存储数据的 key 进行 hash 散列,这样特定的 key 会被定为到特定的节点上。
庆幸的是,Java Redis 客户端驱动 Jedis 已支持 Redis Sharding 功能,即 ShardedJedis 以及结合缓存池的 ShardedJedisPool。

Jedis 的 Redis Sharding 实现具有如下特点:

Original: https://www.cnblogs.com/zhuminghui/p/16491004.html
Author: ''竹先森゜
Title: Redis 三种集群策略

相关阅读2

Title: 05-CentOS7硬盘扩容

CentOS7扩容

最近在练习Elasticsearch做数据插入的时候,突然发现磁盘居然占满了!
关于ES磁盘占用问题可以参考博客:https://blog.csdn.net/qq_16504067/article/details/119132849

  • 扩容之前,我要提醒一下,我因为之前玩的Ubuntu,玩习惯可视化界面了
  • 现在CentOS也是有可视化界面的(当时安装的时候选择的是 自定义,没有选择 典型
  • 在百度搜索相关硬盘扩容的问题后,好像都没有我这种情况(搞得我好像一个傻子(╯▔皿▔)╯)
  • 一般像这种情况,要么就是太简单,要么就是没人装可视化界面;导致目前我搜索不到相对应的博客(我怀疑是太简单)

1、无可视化界面硬盘扩容参考博客

2、有可视化界面硬盘扩容

  • 我就比较奇特了,我是参考上面两篇博客,各取一半,稀里糊涂就完成了扩容(不知道会不会有什么问题)

2.1、VMware设置

  • 关闭CentOS7虚拟机,在VMware界面中给要扩容的虚拟机,先增加硬盘容量(得删除之前保存的快照,可以删了之后再保存当前状态)

2.2、进入终端,完成扩容

  • 使用 lsblk命令查看磁盘大小, 网络上一般找到的都是新增一个分区,然后扩容, *个人不太喜欢分区太多,所以只想简单的对当前使用的sda进行扩容

①、修改分区表

  • fdisk /dev/sda
  • PS:下面的sda几,都是看 lsblk查看自己使用的是哪个磁盘
  • 删除分区3
  • 输入d
  • 回车
  • 3
  • 回车
  • 创建分区3
  • 输入n
  • 回车
  • p
  • 回车
  • 2
  • 回车
  • 回车
  • 回车
  • 输入w
  • 回车

②、更新内核内存分区表

  • partx -u /dev/sda

③、调整物理体积

  • pvresize /dev/sda3

④、更新文件系统大小

  • 查看要更新的文件系统类型
  • mount | grep /dev/sda
  • PS:
  • resize2fs 命令 :针对的是ext2、ext3、ext4文件系统
  • xfs_growfs 命令 :针对的是xfs文件系统
  • 下面就可以根据自己的文件系统类型选择命令进行操作(以 xfs类型做延时,步骤都一致)
  • xfs类型文件系统重新定义大小要使用 xfs_growfs命令( 注意文件系统名称要和自己的系统一致
    • xfs_growfs /dev/sda3
  • 接下来用df-h查看一下文件系统的大小,更改成功!

以上内容步骤很多地方都没有配图的原因是,我已经扩容完成了,于是就想着记录一下自己个人的扩容过程,偏好我个人情况,仅供参考,慎重参考

  • 噢!对了,记得扩容之前弄一张快照,虚拟机玩坏了还可以再恢复

Original: https://www.cnblogs.com/OnlyOnYourself-lzw/p/16535327.html
Author: OnlyOnYourself-Lzw
Title: 05-CentOS7硬盘扩容

相关阅读3

Title: [Git专题] 环境搭建

环境搭建

在正式使用 Git 之前,首先应当安装 Git 并完成一些基础配置,本章内容就教大家在 Ubuntu 和 CentOS 上安装 Git 的方法。

如果你使用的是基于 Debian 的 Linux 发行版本,那么应当使用 apt-get 命令来完成安装操作,如下能查到 Git 版本即为安装成功:

[jerry@CentOS ~]$ sudo apt-get install git-core
password for ubuntu:

[jerry@CentOS ~]$ git --version
git version 1.8.1.2

如果你使用的是基于 RPM 的 Linux 发行版本,那么应当使用 yum 命令来完成安装,同样能够用 Git 命令即为安装成功:

$ su -
Password:

[root@CentOS ~]# yum -y install git-core

[root@CentOS ~]# git --version
git version 1.7.1

Git 提供 Git 配置工具,让你能设置环境变量。Git 将所有全局变量存储在 .gitconfig 文件中,此文件位于你的家目录下。要设置全局变量,需要加上 --global 选项,如果你不加此选项,你设置的变量将仅能用于当前的 Git 仓库。

你也能设置能在整个系统生效的变量,Git 将这种变量存储在 /etc/gitconfig 文件中,这个文件有适用于该系统中的每个用户和仓库的配置。要设置这些变量值,必须要 root 用户的权限并且应加上 --system 的选项。

如果上文的安装工作完成了,就可以进行如下的配置工作————

这个设置会用于 Git 的每次提交操作:

[jerry@CentOS ~]$ git config --global user.name "Jerry"

同上,此设置也会用于每次提交操作:

[jerry@CentOS ~]$ git config --global user.email "jerry@tutorialspoint.com"

当你从远端仓库拉取最新修改时,如果这些修改提交彼此冲突,那么 Git 会默认创建合并提交,我们能通过如下的设置来避免此种合并的发生:

[jerry@CentOS ~]$ git config --global branch.autosetuprebase always

下面的命令让控制台中的 Git 颜色高亮可用:

[jerry@CentOS ~]$ git config --global color.ui true
[jerry@CentOS ~]$ git config --global color.status auto
[jerry@CentOS ~]$ git config --global color.branch auto

默认情况下,Git 使用系统默认编辑器,它由系统环境变量 VISUALEDITOR 决定。我们也能用 git config 命令自己设置一个喜欢的编辑器,如下即设置 vim 为默认编辑器:

[jerry@CentOS ~]$ git config --global core.editor vim

Git 并没有提供用于集成冲突修改提交的合并工具,我们通过下述命令可以自己设置一个:

[jerry@CentOS ~]$ git config --global merge.tool vimdiff

要验证自己的设定在本地仓库是否设置,可使用 git config --list 命令来查看:

[jerry@CentOS ~]$ git config --list

如果所有步骤都按上文所述的命令来操作,那么显示结果应如下所示:

user.name=Jerry
user.email=jerry@tutorialspoint.com
branch.autosetuprebase=always
color.ui=true
color.status=auto
color.branch=auto
core.editor=vim
merge.tool=vimdiff

Original: https://www.cnblogs.com/yychuyu/p/15609034.html
Author: 良许Linux
Title: [Git专题] 环境搭建