名令 | 效果 |
---|---|
cd … | 返回到上一级目录 |
cd - | 回到上次的目录 |
ls | 列表形式显示所有文件 |
mkdir -p 路径 | 创建多级目录 |
rm -rf 目录名称 | 强制递归删除文件 |
cp 源文件 目标文件 | 复制,重命名 |
mv 源文件 目标文件 | 剪切 |
tar -czvf 压缩包的的名字 文件或文件夹 | 打包 |
tar -xzvf 压缩包文件 【解压路径】 | 解压 |
find 路径 -name 文件名 | 查找文件 |
pwd | 当前路径 |
cat 文件名 | 查看文件所有内容 |
more 文件名 | 分页查看文件 |
ps -ef | 查看进程 |
kill -9 进程id | 杀死进程 |
chmoud 数字 文件 | 修改文件权限 |
vim /etc/sysconfig/network-script/ifcfg-eth0 | 修改ip地址 |
vim /etc/hosts | 修改域名映射文件 |
service network restart|stop|start | 网络服务 |
service iptables restart|stop|start | 防火墙服务 |
chkconfig iptables off | 防止防火墙开机自启动 |
crontab -e | 时钟同步 |
tital: #!/bin/bash
#!是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。
窗口输出文本:echo
方式一:(./表示当前目录。直接写 hello.sh, linux系统会去PATH里寻找有没有叫 hello.sh的。)
使脚本有执行权:chmod +x ./hello.sh
执行脚本: ./hello.sh
方式二:(这种方式运行脚本,不需要在第一行指定解释器信息,写了也不生效)
/bin/sh /root/hello.sh
例子:your_name=“itcast.cn”(变量与等号之间不能有空格,变量中间也不能有空格)
使用:${变量名}
$n, n 代表一个数字, 1 为执行脚本的第一个参数, 2 为执行脚本的第二个参数,以此类推…… $0 表示当前脚本名称。
expr:是一款表达式计算工具,使用它能完成表达式的求值操作。
例子:echo expr $a \* $b
注意:表达式和运算符之间要有空格,完整的表达式要被两个 `包含,注意不是单引号,在 Esc 键下边。乘法符号需要用\转义。
#!/bin/bash
a=10
b=20
if [ $a -eq $b ]
then
echo "$a -eq $b : a 等于 b"
else
echo "$a -eq $b: a 不等于 b"
fi
if [ $a -ne $b ]
then
echo "$a -ne $b: a 不等于 b"
else
echo "$a -ne $b : a 等于 b"
fi
if [ $a -gt $b ]
then
echo "$a -gt $b: a 大于 b"
else
echo "$a -gt $b: a 不大于 b"
fi
if [ $a -lt $b ]
then
echo "$a -lt $b: a 小于 b"
else
echo "$a -lt $b: a 不小于 b"
fi
if [ $a -ge $b ]
then
echo "$a -ge $b: a 大于或等于 b"
else
echo "$a -ge $b: a 小于 b"
fi
if [ $a -le $b ]
then
echo "$a -le $b: a 小于或等于 b"
else
echo "$a -le $b: a 大于 b"
fi
for:
for N in 1 2 3
do
echo $N
done
while:
#!/bin/bash
i=1
while (( i <= 3))
do
let i++
echo $i
done
case:
#!/bin/bash
echo '输入 1 到 4 之间的数字:'
echo '你输入的数字为:'
read aNum
case $aNum in
1) echo '你选择了 1'
;;
2) echo '你选择了 2'
;;
3) echo '你选择了 3'
;;
4) echo '你选择了 4'
;;
*) echo '你没有输入 1 到 4 之间的数字'
;;
esac
定义我们自己的函数并在shell脚本当中调用函数
#!/bin/bash
hello(){
echo "hello world"
echo "第一个参数为 $1"
echo "第二个参数为 $2"
}
hello abc 123
/export/servers/zookeeper-3.4.9/bin/zkServer.sh start
查看状态:
/export/servers/zookeeper-3.4.9/bin/zkServer.sh status
创建永久节点:
/** 创建永久节点
* @throws Exception
*/
@Test
public void createNode() throws Exception {
RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 1);
//获取客户端对象
CuratorFramework client = CuratorFrameworkFactory.newClient("192.168.52.100:2181,192.168.52.110:2181,192.168.52.120:2181", 1000, 1000, retryPolicy);
//调用start开启客户端操作
client.start();
//通过create来进行创建节点,并且需要指定节点类
client.create().creatingParentsIfNeeded().
withMode(CreateMode.PERSISTENT).forPath("/hello3/world");
client.close();
}
修改数据:
/**
* 节点下面添加数据与修改是类似的,一个节点下面会有一个数据,新的数据会覆盖旧的数据
* @throws Exception
*/
@Test
public void nodeData() throws Exception {
RetryPolicy retryPolicy = new ExponentialBackoffRetry(3000, 1);
CuratorFramework client = CuratorFrameworkFactory.newClient("node01:2181,node02:2181,node03:2181", 3000, 3000, retryPolicy);
client.start();
client.setData().forPath("/hello5", "hello7".getBytes());
client.close();
}
查询数据:
@Test
public void updateNode() throws Exception {
RetryPolicy retryPolicy = new ExponentialBackoffRetry(3000, 1);
CuratorFramework client = CuratorFrameworkFactory.newClient("node01:2181,node02:2181,node03:2181", 3000, 3000, retryPolicy);
client.start();
byte[] forPath = client.getData().forPath("/hello5");
System.out.println(new String(forPath));
client.close();
}
watch机制:
/** zookeeper的监听机制 */
@Test
public void watchnode() throws Exception {
ExponentialBackoffRetry retry = new ExponentialBackoffRetry(1000, 3);
CuratorFramework client = CuratorFrameworkFactory.newClient("node01:2181", retry);
client.start();
TreeCache cache = new TreeCache(client,"/hello5");
cache.getListenable().addListener(new TreeCacheListener() {
@Override
public void childEvent(CuratorFramework curatorFramework, TreeCacheEvent treeCacheEvent) throws Exception {
ChildData data =treeCacheEvent.getData();
if(data!=null){
switch (treeCacheEvent.getType()){
case NODE_ADDED:
System.out.println("NODE_ADDED:"+data.getPath()+"数据:"+new String(data.getData()));
break;
case NODE_REMOVED:
System.out.println("NODE_REMOVED:"+data.getPath()+"数据:"+new String(data.getData()));
break;
case NODE_UPDATED:
System.out.println("NODE_UPDATED:"+data.getPath()+"数据:"+new String(data.getData()));
break;
default:
break;
}
} else{
System.out.println( "data is null : "+ treeCacheEvent.getType());
} }
});
cache.start();
Thread.sleep(500000000);
}
阻塞 IO 和非阻塞 IO 这两个概念是程序级别的。主要描述的是程序请求操作系统IO 操作后,如果 IO 资源没有准备好,那么程序该如何处理的问题
同步 IO 和非同步 IO,这两个概念是操作系统级别的。主要描述的是操作系统在收到程序请求 IO 操作后,如果 IO 资源没有准备好,该如何响应程序的问题
RPC(Remote Procedure Call Protocol)远程过程调用协议。