
Linux与Shell编程
文章平均质量分 64
本系列主要介绍Linux的相关知识以及Shell编程的语法,示例等。
Laurence
架构师,著有《大数据平台架构与原型实现:数据中台建设实战》一书,对大数据、云计算、数据湖、数据中台、企业级应用架构、域驱动设计有丰富的实践经验。
展开
-
Linux:配置 rz 自动覆盖上传文件
Linux 上的 lz 和 rz 是两个很用的小工具。不少 Shell Client 工具都支持使用它们直接下载和上传文件。对 rz 来说,当一个文件已经存在服务器上时,再次上传同名文件时,为了避免覆盖掉现有文件,rz 选择给新上传的文件添加数字后缀,以作区分。这种处理方式虽然安全,但大多数情况下并不是用户希望的。原创 2024-03-18 12:58:59 · 1464 阅读 · 0 评论 -
Shell 脚本:按日期排序和查找文件 / 删除指定时间范围内的文件
有时候,我们会向一个文件夹里添加或删除文件,随着文件越来越多,操作历史越来越长,最初文件夹的状态可能就记不清了,某些时候,我们可能想恢复到文件夹的初始状态,重新来过,这时候就只能依靠文件修改时间来查找和过滤文件了。一个典型的场景就是:为了运行各种组件,我们会往一个 lib 文件夹中添加各种 Jar 包,有时候,时间久了,Jar 包可能会出现版本冲突,于是我们想清理到近期安装的各种 Jar 包,从初始状态重新开始。是以下字母的一些组合,但是在不同系统上,允许的组合种类也是不一样的,总得来说,原创 2024-02-02 17:57:08 · 2087 阅读 · 0 评论 -
Linux CPU 数据 Metrics 指标解读
过去从未仔细了解过使用 top 和 htop 等命令时显式的CPU信息,本文我们详解解读和标注一下各个数据项的含义,同时和 Ganglia 显式的数据做一个映射。开始前介绍一个小知识,很多查看CPU的命令行工具都是 cat /proc/stat 里的数据,所以数据来源都是一样的,区别只在于显式格式,用户体验上。本文我们以 mpstat 和 uptime 命令为主,最后介绍一下 top 和 htop 的一些细微差异。原创 2023-12-29 15:50:18 · 576 阅读 · 0 评论 -
Linux 内存数据 Metrics 指标解读
过去从未仔细了解过使用 free、top 等命令时显式的内存信息,只关注了已用内存 / 可用内存。本文我们详解解读和标注一下各个数据项的含义,同时和 Ganglia 显式的数据做一个映射。开始前介绍一个小知识,很多查看内存的命令行工具都是 cat /proc/meminfo 里的数据,所以数据来源都是一样的,区别只在于显式格式,用户体验上。本文我们以 free 命令为主,最后介绍一下 top 和 htop 的一些细微差异。原创 2023-12-29 14:19:26 · 670 阅读 · 0 评论 -
使用 async-profiler 分析 CPU 和内存使用情况
async-profiler 是非常主流的 Java Profiling 工具之一,且对 Linux 支持良好,适合分析运行在服务器上的 Java 应用程序在 CPU 和内存上的占用情况。本文介绍一下 async-profiler 的安装和使用方法。原创 2023-12-28 11:37:07 · 1689 阅读 · 0 评论 -
YCSB 测试表预分区
最近使用 YCSB 测试时,一直使用如下方法创建预分区:但是这样创建出来的分区其实头和尾两个分区是没有数据的,因为它的RowKey Range将分别是:Start Key = 空, End Key = user1000 Start Key = user9999, End Key= 空而 YCSB 自动生成的 Rowkey 是从 user1xxxx 开始的,user1000 之前不会有任何数据,user9999 之后只会有极少的数据,所以,应该修正分区的 row key 切分,改下面的方式就非常均衡了原创 2023-12-26 23:05:44 · 215 阅读 · 0 评论 -
Shell 迭代读取 CSV 文件为变量赋值
有时候,我们可能需要在 Shell 中维护一个KV结构的数组,也就是类似于 List这样的数据结构,但是这在 Shell 中并不容易实现,一些联合使用 Shell 的 Indexed Arrays 和 Associative Arrays 进行模拟的方案虽然可行,但其实使用起来还是很别扭的,此时,最自然做法是把这些值抽离到单独的 CSV 文件中维护,然后用 Shell 循环读取每一行并对变量进行赋值。原创 2023-12-25 17:26:01 · 387 阅读 · 0 评论 -
正则表达式:过滤 S3 上以 _$folder$ 结尾的占位文件
当我们使用命令行批量从 S3 上拷贝文件或统计文件数量时,希望能排除掉 S3 上以 _$folder$ 结尾的占位文件,这个正则表达式应该怎么写呢?以下是统计 S3 某个位置下的除 _$folder$ 结尾的文件的文件数量原创 2023-12-25 02:12:52 · 348 阅读 · 0 评论 -
使用 jq 处理 json 文件的最佳实践
1. 使用 jq 格式化 json 文本后再存入 json 文件,但不回显 json 内容;2. 使用 jq 格式化 json 文本后再存入 json 文件,同时回显 json 内容(无 jq 语法着色);3. 使用 jq 格式化 json 文本后再存入 json 文件,同时回显 json 内容(有 jq 语法着色)原创 2023-12-25 02:14:01 · 268 阅读 · 0 评论 -
使用 iperf 和 iftop 测试网络带宽
有时候,我们需要确切地知道服务器在当前网络环境下所能达到的上行和下行的网络带宽是多少,这对于测试一些上传或下载的作业效率非常重要。我们以位于AWS VPC 环境中的 EC2 为例,介绍一下如何实测出 EC2 节点所能达到的最大带宽。我们以 m5.4xlarge 这一机型为例,根据 AWS 官方文档的介绍:https://aws.amazon.com/ec2/instance-types/m5/,该型实例可以达到的最高带宽是 10 Gbps,我们将使用两台 m5.4xlarge,通过 iperf 来实测一下两原创 2023-12-09 16:29:46 · 2824 阅读 · 0 评论 -
解密 Shell 重定向:>、>1、2>、&>、>&、2>&1、1>&2 、/dev/null、>>、>>2、&>>
Shell 重定向这部分知识比较琐碎,符号很多,各种操作符又有多种“变种”,所以会让人感觉很凌乱。本文试图对这部分内容做一些规范化的梳理,主要以 GNU 官方文档为准。首先,有必要“温习”一个基础知识点:在Linux上一切皆文件!所有的设备都可以使用一个文件来描述或代表,这一点在重定向操作中体现的尤为明显,例如:0,1,2,/dev/null 都是文件,其中:0代表文件/dev/stdin,1代表文件/dev/stdout,2代表文件/dev/stderr。而这些文件又分别代表了某种设备:/dev/stdi原创 2023-09-06 15:59:41 · 1978 阅读 · 0 评论 -
Shell 编程技巧:批量转换Markdown文件
由于一些原因,需要将以前编写的所有markdown文件转成docx文件,以便做一个备份,特别是原文档中引用的图片需要嵌入docx文件,作本地化保存。先上脚本吧原创 2023-09-03 11:59:19 · 461 阅读 · 0 评论 -
使用正则表达式在中英文之间添加空格
有时为了排版需要,我们可能需要在文章的中英文之间添加空格,特别是中文中引用了英文单词时,这种情况使用正则表达式整体修订是最明智的做法。首先,推荐使用在线的正则表格式工具:https://regex101.com/ , 该工具非常强大,支持几乎所有的编程语言风格!原创 2023-09-02 12:23:22 · 1982 阅读 · 0 评论 -
Shell 编程技巧:数组和逗号分隔的字符串之间的任意转换
【代码】Shell 编程技巧:数组和逗号分隔的字符串之间的任意转换。原创 2023-08-30 16:54:04 · 1158 阅读 · 0 评论 -
Shell 编程技巧:从URL、文件路径截取文件名或文件夹名
从URL、文件路径截取文件名或文件夹名是一项很常见的操作,常规思路是操作字符串甚至是正则表达式来截取需要的部分,但实际上,作为一项非常基础和常见的操作,shell提供了一个很好的命令行工具:basename 来简化这项操作。以下就是一份示例原创 2023-08-29 17:47:54 · 959 阅读 · 0 评论 -
从本地目录和S3目录生成Classpath字符串的最佳实践
从一个目录生成Classpath字符串是一个非常常见的问题,在使用命令提交一个Java、Spark作业时会经常遇到。通常遇到的遇到情况是:将本地目录下的Jar文件拼接成一个Classpath字符串,这时,通常我们可以使用这样的命令原创 2023-07-10 17:57:31 · 306 阅读 · 0 评论 -
jq判断对象中含有值为null或空字符串的字段
在jq中[]并不一定仅指数组,当对应的元素不是一个数组,而是一个Json对象(或嵌套对象)时,[]可以指代对象中的所有元素,类似于*这样的通配符当字段赋值是null时,例如:{“MskcPluginName”: null},使用jq读取出的值是值为“null”的字符串,而不是报错或返回空值,这会给脚本解析这个字段带来麻烦,如不做检查,就会把“null”当成了合法值去处理了,这就是下面代码中使用if进行一次检查的主要原因如果Json总是由Shell脚本生成的,其实不必使用原创 2023-07-01 20:34:28 · 1157 阅读 · 0 评论 -
制作带Systemd的CentoOS Docker镜像并在Docker/Kubernete中启动
有时候我们需要在Kubernetes中创建一个用于测试或调试网络环境的POD,一个纯净的CentOS镜像是比较好的选择。不过,默认的CentOS镜像没有开启systemd,有时候会造成一些不便,本文简述一下制作带Systemd的CentoOS Docker镜像。此外,由于CentOS已经不再更新,某些版本的CentOS(例如8)的Yum源也不在了,可能出现无法安装软件的问题。原创 2023-05-20 10:38:17 · 586 阅读 · 0 评论 -
免sudo执行docker命令
为什么执行Docker命令需要sudo? Docker的守护进行是绑定到一个Unix socket上的,位置是:/var/run/docker.sock,默认owner是root,也就是说:Docker的守护进行是以root用户身份运行的。所以执行很多docker命令都需root权限。免sudo执行docker命令从/var/run/docker.sock的文件属性上可以看到,除了owner: root有RW权限外,user group: docker也拥有同等的权限原创 2023-05-20 10:13:08 · 1640 阅读 · 0 评论 -
Error: parsing SSH public key “~/.ssh/id_rsa.pub“: parsing key: ssh: no key found 解决方法
产生这一错误的原因是:~/.ssh/id_rsa.pub文件可能不是通过ssh-keygen生成的原始文件,而是通过别的工具导出的,最可能的情况就是通过。所以会出现解析错误。解决方法是: 使用ssh-keygen从私钥生成的公钥文件。原创 2023-05-06 12:28:29 · 633 阅读 · 0 评论 -
在Shell中实现延迟加载(Lazy Loading)
考虑这样一种场景:在一段Shell脚本中存在一个变量A,其值是通过一个命令行动态获取的(例如CLI客户端和服务器/API交互之后方可得到),如果每次获取变量A都通过CLI发起一次远程请求显然不够明智,脚本执行效率也会变慢。但是,脚本中会大量引用变量A,且脚本封装了大量功能单一的函数,调用顺序和时机都会因参数不同而动态调整,所以。很多高级编程语言都内置支持Lazy Loading(延迟加载)特性,因为这一特性具有普遍的适用场景,遗憾的是在Shell中并不具备这一特性。这是一个非常好的延迟加载实现,原创 2022-11-28 08:30:00 · 1064 阅读 · 0 评论 -
为什么要把Linux机器加入到Windows AD/域控制器(Linux机器为什么要入域)?
1. 如何入域?2. 如何判断入域成功?3. 入域的效果(目的)是什么?4. 入域和SSSD之间是什么关系?原创 2022-11-28 08:45:00 · 2719 阅读 · 0 评论 -
Python PIP 配置文件的存放位置与加载顺序
介绍如何在Linux上查看和设置全局或局部的Python镜像源。根据官方文档: [https://pip.pypa.io/en/stable/topics/configuration/](https://pip.pypa.io/en/stable/topics/configuration/) 的解释,PIP的配置有三个“层级”,分别对应着三个配置文件,且在Linux/Windows下都存放于不同的位置。这三个层级分别是:- Global: 系统级- User: 用户级- Site: (虚拟)环境原创 2022-10-31 15:36:37 · 9810 阅读 · 3 评论 -
Linux安装DataHub (开源元数据管理工具)
安装Docker & JQ, 创建docker组并将当前用户加入其中;安装Docker Compose (V2);安装DataHub原创 2022-10-27 19:39:20 · 2054 阅读 · 0 评论 -
Linux源码安装软件包时--prefix的配置建议
我们知道,使用源码安装软件包时通常会提供一个config或configure脚本对安装进行一些必要的配置,其中最为常见的是–prefix选项,它用于指定软件安装的父级目录,也就是将软件安装在哪个文件夹下面。的好处是像软件包自身的bin,lib,include,share等文件夹下的文件会自动安装到/usr/local下对应的文件夹中,与使用yum安装的方式较为类似,从文件的安放位置上看更加像是“软件包分散融入到了Linux的约定位置”,由于这些约定位置在OS层面上做了一些配置,安装后可以省掉一些额外配置。原创 2022-10-27 19:09:28 · 2266 阅读 · 0 评论 -
Linux源码安装OpenSSL(近期高版本)
目前Yum的OpenSSL版本是1.0.2k,如需安装更高版本,需要从源代码编译安装。原创 2022-10-27 17:10:47 · 1552 阅读 · 0 评论 -
Linux源码安装Python(近期高版本)
目前Yum的Python版本是3.7,如需安装更高版本,需要从源代码编译安装。原创 2022-10-27 16:37:19 · 680 阅读 · 0 评论 -
Maven Resources Plugin的Filtering功能的Bug
Maven Resources Plugin的Filtering功能是非常强大的,是构建中非常重要的一项必备特性,但是最近发现了Filtering在过滤复杂文本(例如Shell脚本)时,会有一些问题,简单记录一下。以下是一段Shell脚本,脚本会多次引用:以下是上述脚本经Filtering处理后的版本,基中红色高亮的第三行并不是脚本中的语句,只是为了说明Filtering在进行文本替换时的行为特征而加的。从前后对比中可以看到:复杂的并没有被提换,而单独一行的被正确替换了。至于原因大概是脚本过于复杂,原创 2022-06-22 17:56:03 · 967 阅读 · 0 评论 -
集成 OpenLDAP 与 Kerberos 实现统一认证 (2):基于 SSSD 同步 LDAP 账号
本文首发于 InfoQ,写作本系列文章的背景是我们要在大数据平台/企业数据湖场景下给出中心化的用户身份认证方案。此前,我们实现过Windows AD + Kerberos的集成方案,由于Windows AD是LDAP和Kerberos的双重实现,这种天然优势使得Windows AD可以实现真正意义上的(大数据集群的)Kerberos账号与企业用户账号的统一管理。当我们想在OpenLDAP + Kerberos上实现同样的目标时,发现这一领域的知识与方案琐碎而凌乱,缺少统一连贯,脉络清晰的讲解原创 2022-06-07 17:10:01 · 3484 阅读 · 1 评论 -
集成 OpenLDAP 与 Kerberos 实现统一认证 (1):整合后台数据库
本文首发于 InfoQ,写作本系列文章的背景是我们要在大数据平台/企业数据湖场景下给出中心化的用户身份认证方案。此前,我们实现过Windows AD + Kerberos的集成方案,由于Windows AD是LDAP和Kerberos的双重实现,这种天然优势使得Windows AD可以实现真正意义上的(大数据集群的)Kerberos账号与企业用户账号的统一管理。当我们想在OpenLDAP + Kerberos上实现同样的目标时,发现这一领域的知识与方案琐碎而凌乱,缺少统一连贯,脉络清晰的讲解原创 2022-06-07 17:02:40 · 3528 阅读 · 3 评论 -
sed正则表达式的使用以及使用sed修改配置文件的典型案例
场景描述:找到指定的行,将其注释掉(是直接注释,不是修改值),然后紧接下一行插入新内容这种场景在修改配置文件时最常见,注释和插入的往往是同一配置项,为了维护配置文件的可读性,通常会将关系紧密的几项配置放在一起,这就是为什么需要紧接下一行插入新内容的原因。我们现在要编辑/var/kerberos/krb5kdc/kdc.conf文件,编辑内容为:找到现有的database_name配置项将其注释掉,然后紧邻下一行插入新的配置项(因为两项配置关系密切)...原创 2022-06-06 12:32:30 · 903 阅读 · 0 评论 -
SSH的GSSAPIAuthentication和KerberosAuthentication的区别
在SSH的/etc/ssh/sshd_config配置文件中有两个“看上去”很紧密的配置项:GSSAPIAuthentication和KerberosAuthentication,原因是:大家都知道在大多数情况下GSSAPI认证就是Kerberos认证,所以问题来了:那SSH里的这个KerberosAuthentication又是什么呢?和GSSAPIAuthentication有什么关系呢?我们接下来通过5组对比测试把这个问题解释清楚。...............原创 2022-06-06 09:30:00 · 3901 阅读 · 0 评论 -
Shell命令行参数解析getopt的使用范例
#!/bin/sh## Shell script to demonstrate use of Linux getopt command for parsing command options.# - Built-in getopts can only handle one-character options so getopt command is necessary# Supporting functions, alphabetized...# Parse the command line转载 2020-10-14 14:56:24 · 1613 阅读 · 1 评论 -
如何制作一个AWS EMR客户端节点( Client Node / Edge Node / Gateway Node )
为什么需要EMR客户端节点?对于AWS EMR不提供专职的客户端节点( Edge Node / Gateway Node )一事,作为一名架构师,我持保留意见。个人认为这并不明智,其客观上削弱了EMR的易用性。尽管云计算的“处世哲学”认为:计算与存储应该是分离的,这使得计算资源变成动态可调节的“非永久性”资源,因此有一种思想认为:对于离线的分析型计算而言,可以不必再维持一个“永久”的计算集群,而是在使用时开启,结束时关闭,只要数据被S3这类的存储服务保存下来即可(我们得承认这是很美好一个愿景,但是现原创 2020-09-11 10:26:32 · 2142 阅读 · 2 评论 -
OpenTSDB 2.4安装报org.hbase.async.TableNotFoundException: “tsdb“错误
使用rpm包安装目前最新的OpenTSDB 2.4时,会在启动时报:org.hbase.async.TableNotFoundException: "tsdb"经过排查,发现是由于OpenTSDB使用的HBase数据库初始化脚本/usr/share/opentsdb/tools/create_table.sh中关于tsdb的建表脚本有错误,原始内容为:create '$TSDB_TABLE', {NAME => 't', VERSIONS => 1, COMPRESSION =>原创 2020-08-26 09:43:25 · 1284 阅读 · 0 评论 -
OpenTSDB 2.4安装报FileNotFoundException: LOG_FILE_IS_UNDEFINED (Permission denied)错误
使用rpm包安装目前最新的OpenTSDB 2.4时,会在启动时报:FileNotFoundException: LOG_FILE_IS_UNDEFINED (Permission denied)经过排查,发现是由于OpenTSDB使用的logback配置文件/usr/share/opentsdb/etc/opentsdb/logback.xml中存在配置错误,文件中使用到的两个变量${LOG_FILE}和${QUERY_LOG}都没有被赋值或使用实际值进行替换,导致OpenTSDB在启动时由于找不到原创 2020-08-26 09:30:10 · 1282 阅读 · 0 评论 -
Ubuntu桌面系统安装配置备忘
每次安装Ubuntu桌面系统总有一些琐碎的问题需要一一解决,linux毕竟不像windows,很多操作还是需要靠命令完成的,由于这些操作并不常用,所以每次装完系统之后就忘了,下次再安装时还得重新查找解决方法,本文将对我个人安装ubuntu时遇到的一些常见问题进行总结,记录下解决方法以备后查。1. 从硬盘安装Ubuntu一般情况下Ubuntu都是作为第二系统进行安装的,如何在Windows下安装Ub原创 2013-03-08 14:58:01 · 7011 阅读 · 2 评论 -
硬盘分区备忘(主分区,扩展分区和逻辑分区)以及Linux硬盘分区工具parted 介绍
我们知道硬盘的第一个扇区也就是第0扇区是用来存放主引导记录(MBR)的,因此也称MBR扇区。一个扇区是512字节,因此MBR的大小也是512字节,其具体数据结构是:446个字节的引导代码、64个字节的分区表及2个字节的签名值"55AA"。由于MBR的分区表只有64个字节,这决定了它只能存储4个分区记录。这就是为什么一块硬盘最多只能有4个“主分区"的原因。记住,“主分区”就是指记录在主引导记录MBR原创 2013-06-27 16:36:43 · 22820 阅读 · 1 评论 -
Linux搭建SVN服务器极简备忘
1. yum install subversion #安装svn2. groupadd svn #为运行svn设置专用的用户组,非必须操作,但推荐3. useradd -g svn svn #为运行svn设置专用的用户,非必须操作,但推荐4. passwd svn #为运行svn专用用户设置密码,非必须操作,但推荐5. mkdir -p /var/svn #建立/var/svn原创 2014-12-30 09:09:08 · 10537 阅读 · 4 评论 -
vsftpd中关于ftpusers和user_list两个文件的说明以及vsftpd.conf中的userlist_enable和userlist_deny两个配置项的解释
问题一:ftpusers和user_list两个文件各自的用途是什么?有何关系?首先请明确一点:ftpusers不受任何配制项的影响,它总是有效,它是一个黑名单!该文件存放的是一个禁止访问FTP的用户列表,通常为了安全考虑,管理员不希望一些拥有过大权限的帐号(比如root)登入FTP,以免通过该帐号从FTP上传或下载一些危险位置上的文件从而对系统造成损坏。而user_list则是和vsftpd.c原创 2014-12-31 09:09:30 · 73688 阅读 · 6 评论