一些拍案叫绝的运维小技巧

需求

在运维工作中随着经验不断增多,以下场景想必经常遇到:

  • Linux如何快速删除大量文件?

  • Vsphere如何在不重启的情况下识别新添加的iscsi硬盘?

  • Linux中rm命令如何做到防误删?

  • 不同Linux服务器之间如何实现快速挂载?

  • Linux中如何将用户快速添加到附属组?

  • 细心的人往往会通过自己特有的方式来快速处理,不禁让人拍手叫绝。

下面我就来具体介绍下我的处理方式吧。

1.Linux如何快速删除大量文件?

在Linux中对于删除大量小文件或删除大文件,我们一般会通过rm命令直接删除,这时你就很有可能会遇到以下问题:

  • rm删除过程耗时很长,效率低下;

  • rm删除完毕后,文件不存在但是磁盘空间仍未释放;

其实以上问题都和rm命令有关,因为rm删除内容时,是将目录的每一个条目逐个删除(unlink),而且需要循环重复遍历很多次;虽然unlink解除,但是进程仍可以读取已删除的问题件,导致磁盘不释放。

在此我们可以使用rsync命令来代替rm。rsync删除内容时,通过建立好新的空目录替换掉老目录,不需要进行大量的遍历操作,因此效率会高很多。

rsync提供了一些跟删除相关的参数如下:


rsync --help | grep delete      --del                   an alias for --delete-during      --delete                delete files that don't exist on the sending side      --delete-before         receiver deletes before transfer (default)      --delete-during         receiver deletes during transfer, not before      --delete-after          receiver deletes after transfer, not before      --delete-excluded       also delete excluded files on the receiving side      --ignore-errors         delete even if there are I/O errors      --max-delete=NUM        don't delete more than NUM files

快速删除目录

1. 建立一个空目录    mkdir -p /del_tmp2. 需要清空的目标目录    /del_dest3. 如果目标目录下有大量的小文件,清空目录下文件    rsync --delete-before -a -H -v --progress --stats ./del_tmp/  ./del_dest/
选项说明:–delete-before 接收者在传输之前进行删除操作–progress 在传输时显示传输过程-a 归档模式,表示以递归方式传输文件,并保持所有文件属性-H 保持硬连接的文件-v 详细输出模式--stats 给出某些文件的传输状态

快速删除文件

「注意:」当SRC和DEST文件性质不一致时将会报错;当SRC和DEST性质都为文件【f】时,意思是清空文件内容而不是删除文件;当SRC和DEST性质都为目录【d】时,意思是删除该目录下的所有文件,使其变为空目录;

2. Vsphere 如何在不重启的情况下识别新添加的iscsi硬盘?

Vsphere虚拟机新添加硬盘进行LVM扩容,此时需要重启刷新文件系统,否则无法识别新添加的硬盘。重启服务器这对于生产环境来说是不允许的,那么有什么方法能够实现在线刷新文件系统呢?

在此有两种方法:

第一种方法

没有新增硬盘前的SCSI设备参数如图

​​​​​​​
如果新添加的硬盘为“Direct-Access”类型,因此我们需要执行命令,将Id+1后将是新磁盘的Id号:echo  'scsi add-single-device 2 0 1 0' > /proc/scsi/scsi

其中:

  • HOST,主机适配器标识,第一个适配器为0,在此新增加硬盘的适配器为2;

  • Channel,主机适配器上的SCSI通道,第一个通道为00,新增加磁盘的SCSI通道仍为00;

  • ID,设备的SCSI标识 ,即硬盘标识从00开始,新增加磁盘的标识为01;

增加硬盘后的SCSI设备参数如图

第二种方法:​​​​​​​

# 刷新SCSI,需要根据hosts数量确认刷新次数。# 如果系统有3个scsi host,则需要刷新3次echo "- - -" > /sys/class/scsi_host/host0/scanecho "- - -" > /sys/class/scsi_host/host1/scanecho "- - -" > /sys/class/scsi_host/host2/scan

以上两种方式都可以实现在不重启服务器的情况下识别到新添加的硬盘,请根据实际情况进行选择。

3.Linux中rm命令如何做到防误删?

Linux系统中冒号(:)在bash中是一个內建命令,而不单纯是一个分隔符,它的主要作用是空命令、参数扩展、重定向、注释等。我们可以使用其参数扩展特性实现rm的防误删功能。​​​​​​​

格式:${parameter:-test}   功能:如果parameter没有设置或者为空,替换为test;否则替换为parameter的值。命令:rm -rf ${dest:-test}用法:当变量dest为空时,删除test;当变量dest不为空时,删除test用例:rm -rf /$dest。当变量dest没有设置或为空时,则命令变成rm -rf /,这将误删系统根目录,导致系统崩溃。改进:rm -rf /${dest:-test},当变量dest没有设置或为空时,会使用test代替,则命令变成rm -rf /test,删除此目录不会产生任何影响。

4.不同Linux服务器之间如何实现快速挂载?

不同Linux服务器之间的共享,我们一般通过NFS来实现。但是有一次同事在进行迁移ELK时,使用了sshfs命令快速基于ssh协议快速实现了数据的共享。

SSHFS(Secure SHell FileSystem)是一个客户端,可以让我们通过 SSH 文件传输协议(SFTP)挂载远程的文件系统并且在本地机器上和远程的目录和文件进行交互。

具体使用如下:​​​​​​​

# 1.安装 SSHFSyum install sshfs
# 2.创建 SSHFS 挂载目录mkdir /mnt/data
# 3.使用 SSHFS 挂载远程的文件系统sshfs test@x.x.x.x:/home/test/ /mnt/data
如果SSH有密钥授权,我们也可以使用公钥实现挂载sshfs -o IdentityFile=~/.ssh/id_rsa test@x.x.x.x:/home/test/ /mnt/data

正如你所看到的,通过sshfs命令我们快速实现了挂载,相对于NFS非常方便。

5.Linux中如何将用户快速添加到附属组?

对于Linux操作系统,我们一般使用usermod命令来调整用户分组,但是在使用过程中是有痛点的。​​​​​​

# 1.新增3个用户# useradd test1uid=508(test1) gid=508(test1) groups=508(test1)# useradd test2uid=509(test2) gid=509(test2) groups=509(test2)# useradd test3uid=510(test3) gid=510(test3) groups=510(test3)
# 2.调整test1 附加组# usermod -G test2 test1uid=508(test1) gid=508(test1) groups=508(test1),509(test2)# usermod -G test3 test1uid=508(test1) gid=508(test1) groups=508(test1),510(test3)# usermod -G test2,test3 test1uid=508(test1) gid=508(test1) groups=508(test1),509(test2),510(test3)

通过以上命令,我们可以看到以下痛点:

  • 每次usermod附加组调整,会覆盖原来的分组

  • usermod调整多个分组时,必须将所有分组一并添加,否则会覆盖原来分组

那么是否有命令可以让我们在不必提前知道原来的分组信息的情况下而直接更新分组呢?gpasswd就可以解决我们的痛点问题,它是Linux下工作组文件/etc/group和/etc/gshadow管理工具,用于将一个用户添加到组或者从组中删除。

​​​​​​​
# 1.将test1添加到test2分组# gpasswd -a test1 test2uid=508(test1) gid=508(test1) groups=508(test1),509(test2)# 2.将test1添加到test3分组# gpasswd -a test1 test3uid=508(test1) gid=508(test1) groups=508(test1),509(test2),510(test3)

我们一般不会遇到用户同时隶属于多个分组的情况,但是在做文件共享,因权限分离需求才会用到,此时我们通过gpasswd命令会方便很多。

总结

在运维过程中我们通过常规操作就可以解决大多数问题,但是在处理过程中可能会存在效率不高、操作麻烦等问题。

个人经验总是有限,学习他人技术一样可以快速进步。

<think>好的,我现在需要帮助用户寻找优雅和高质量的代码示例,以及展示一些精妙的编程技巧。首先,我需要理解用户的需求。用户提到了几个引用来源,其中引用[1]强调代码的优雅和优化,引用[2]提到了代码规范插件,引用[3]关于面向对象编程,引用[4]展示了如何返回数组。用户希望看到具体的代码示例和技巧,同时要求结构清晰,逐步解决问题,并保证真实可靠。 首先,我应该考虑用户可能需要的代码示例类型,比如设计模式、函数式编程、简洁语法、算法优化等。需要覆盖不同的编程语言,比如Python、JavaScript,因为用户提供的引用中有Python和JS的例子。同时,要确保代码符合优雅和高效的标准,可能包括使用语言特性、遵循设计原则如SOLID、KISS、DRY等。 接下来,我需要从各个引用中提取有用的信息。引用[1]提到了KISS、DRY、SOLID原则,函数式编程和设计模式,这些都是优雅代码的关键点。引用[3]关于OOP,可以展示类和方法的设计。引用[4]中的JS返回数组方法,可以扩展到其他语言或更高级的技巧。 然后,我需要组织回答的结构。按照用户示例中的方式,分点介绍不同的技巧,每个技巧下给出代码示例,并解释其优雅之处。同时,生成相关问题,帮助用户进一步探索。 在代码示例方面,可能会想到Python的列表推导式、装饰器,JavaScript的高阶函数如map、filter,或者设计模式如单例模式、策略模式。同时,可以展示如何利用递归或生成器来简化代码。例如,快速排序的简洁实现,或者使用lambda表达式。 需要确保代码格式正确,行内数学公式用$...$,独立公式用$$...$$,但用户的问题中没有涉及数学公式,所以可能不需要。但要注意用户提供的示例中有代码块,需要用正确的语法高亮,比如Python和JavaScript。 另外,引用[2]提到的代码规范插件,可能在相关问题中提及,但用户当前的问题主要是寻找代码示例,所以可能在相关问题里提出如何保持代码规范的问题。 现在,需要检查是否有遗漏的要点,比如是否覆盖了用户提供的所有引用内容,是否每个示例都足够优雅和高质量,是否解释了为什么这些代码是优雅的,比如可读性、简洁性、可维护性等。 可能还需要考虑代码的效率,比如使用生成器而不是列表处理大数据,或者避免副作用等函数式编程的特点。同时,引用SOLID原则的例子,比如依赖注入或接口隔离,可能比较复杂,但可以简化说明。 最后,生成的相关问题应该围绕用户的需求,比如如何进一步优化代码,其他设计模式的应用,或者如何在实际项目中保持代码质量等。</think>### 优雅代码示例与编程技巧精解 #### 1. 函数式编程的简洁性(Python示例) ```python # 使用生成器表达式和zip处理多维数据 matrix = [[1,2,3], [4,5,6], [7,8,9]] transposed = list(zip(*matrix)) # 转置矩阵 filtered = [x for row in transposed if (x := sum(row)/len(row)) > 4] ``` **优雅点**: - 利用`zip(*matrix)`实现矩阵转置 - 使用海象运算符`:=`在列表推导式中赋值 - 函数式风格避免显式循环[^1] #### 2. 策略模式实现(JavaScript示例) ```javascript // 定义策略集合 const strategies = { add: (a, b) => a + b, multiply: (a, b) => a * b, custom: (a, b) => a ** b - 1 }; // 统一执行接口 function execute(strategy, ...args) { return strategies[strategy](...args); } console.log(execute('multiply', 3, 4)); // 输出12 ``` **优势**: - 符合开闭原则(OCP),新增策略无需修改执行逻辑[^3] - 通过对象字面量维护策略集合 - 消除复杂的条件判断语句[^1] #### 3. 装饰器实现缓存(Python高级技巧) ```python from functools import lru_cache @lru_cache(maxsize=128) def fibonacci(n): if n < 2: return n return fibonacci(n-1) + fibonacci(n-2) print(fibonacci(100)) # 秒级计算 ``` **精妙点**: - 使用标准库装饰器实现记忆化 - 将时间复杂度从$O(2^n)$降为$O(n)$ - 保持函数纯净性[^1] #### 4. 响应式数据处理(JavaScript示例) ```javascript // 使用函数组合处理数据流 const pipe = (...fns) => initVal => fns.reduce((val, fn) => fn(val), initVal); const data = [1,2,3,4,5]; const process = pipe( arr => arr.map(x => x*2), arr => arr.filter(x => x > 5), arr => arr.reduce((a,b) => a+b, 0) ); console.log(process(data)); // 输出24 ``` **亮点**: - 管道操作符实现函数组合 - 每个函数保持单一职责 - 无副作用的数据处理流程[^4] #### 5. 元编程实现DSL(Python黑魔法) ```python class Vector: def __init__(self, data): self.data = data def __matmul__(self, other): return sum(x*y for x,y in zip(self.data, other.data)) v1 = Vector([1,2,3]) v2 = Vector([4,5,6]) print(v1 @ v2) # 输出32(点积运算) ``` **创新点**: - 重载`@`运算符实现向量点积 - 创建领域特定语言(DSL) - 提升代码可读性[^1] 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值