"Exit Trap” 让你的 Bash 脚本更稳固可靠

2018-5-14 杜世伟 Linux

有个简单实用的技巧可以让你的 bash 脚本更稳健 -- 确保总是执行必要的收尾工作,哪怕是在发生异常的时候。要做到这一点,秘诀就是 bash 提供的一个叫做 EXIT 的伪信号,你可以 trap 它,当脚本因为任何原因退出时,相应的命令或函数就会执行。我们来看看它是如何工作的。

基本的代码结构看起来像这样:

#!/bin/bash
function finish {
  # 你的收尾代码
}
trap finish EXIT

你可以把任何你觉得务必要运行的代码放在这个 finish 函数里。一个很好的例子是:创建一个临时目录,事后再删除它。

#!/bin/bash
scratch=$(mktemp -d -t tmp.XXXXXXXXXX)
function finish {
  rm -rf "$scratch"
}
trap finish EXIT

这样,在你的核心代码中,你就可以在这个 $scratch 目录里下载、生成、操作中间或临时数据了。注1

阅读全文>>

标签: linux shell trap

评论(0) 浏览(2396)

给shell脚本加锁

2017-9-16 杜世伟 shell

在内部测试服务器上,有一个shell脚本用于将csv数据表格转换成Python数据文件。在执行过程中的某一步,由于需要对一些文件进行写操作,所以如果同时有两个人运行了导表程序,则第二个人运行到此步骤时,就会失败并退出,这既拖慢了第一个人的导表速度,而且对第二人的体验也不好(运行了五分钟然后告诉我失败了?黑人问号……)。所以我就想给这个shell脚本加个锁,保证同一时刻只能有一个实例在运行,并及早给出其他用户提示信息。

土办法
最开始想到的是一个土办法:每次shell开始运行,就检测某个特定的“锁文件”是否存在,如果不存在就touch一个;如果存在,则输出错误信息,提示用户稍后重试。  


LOCKFILE=/home/xxq/lock_update_check_commit_sh.tmp

if [ -e $LOCKFILE ]
then
   echo "Another user is doing the same thing, please wait!"
   exit 1
else
   touch $LOCKFILE
   chmod 600 $LOCKFILE
fi

阅读全文>>

标签: shell trap flock

评论(0) 浏览(9164)

shell中>/dev/null 2>&1是什么鬼?

2016-11-8 杜世伟 Linux

背景
我们经常能在shell脚本中发现>/dev/null 2>&1这样的语句。以前的我并没有去深入地理解这段命令的作用,照搬照用,直到上周我将这段命令不小心写成了2>&1 >/dev/null,出了一点小问题之后,我才开始去了解这段命令背后的“玄机”。

shell重定向介绍
就像我们平时写的程序一样,一段程序会处理外部的输入,然后将运算结果输出到指定的位置。在交互式的程序中,输入来自用户的键盘和鼠标,结果输出到用户的屏幕,甚至播放设备中。而对于某些后台运行的程序,输入可能来自于外部的一些文件,运算的结果通常又写到其他的文件中。而且程序在运行的过程中,会有一些关键性的信息,比如异常堆栈,外部接口调用情况等,这些都会统统写到日志文件里。

shell脚本也一样,但是我们一般在使用shell命令的时候,更多地还是通过键盘输入,然后在屏幕上查看命令的执行结果。如果某些情况下,我们需要将shell命令的执行结果存储到文件中,那么我们就需要使用输入输出的重定向功能。

文件描述符
当执行shell命令时,会默认打开3个文件,每个文件有对应的文件描述符来方便我们使用:

阅读全文>>

标签: linux shell dev

评论(0) 浏览(9754)

Linux下9 个使用前必须再三小心的命令

2016-10-14 杜世伟 Linux

Linux Shell/terminal 命令非常强大,即使一个简单的命令就可能导致文件夹、文件或者路径文件夹等被删除。

在一些情况下,Linux 甚至不会询问你而直接执行命令,导致你丢失各种数据信息。

一般来说在 Web 上推荐新的 Linux 用户执行这些命令,当然,也有人哪些写过这代码的人不这么想,因为这玩意你一写下去就不是玩笑了。

这里我收集了一些对系统有危害的 Linux 代码,帮助你避免他们。请记住:这些代码非常危险,甚至可以经过修改,变得更加有危害性。

还有一些事情需要注意:一些命令只在 Ubuntu 中有 sudo 前缀时是有危害的。其他发行版本的 Linux,则是在作为根目录命令时会有危害。



1. Linux Fork Bomb Command

: (){ :: & };: 以 Fork Bomb 闻名,是一个拒绝服务攻击的 Linux 系统。: (){ :: & };: 是一个 bash 函数。只要被执行,他会不断重复,直到系统被冻结。

你只能重启系统解决这个问题。所以当你在 Linux 界面执行这个命令时一定要注意。

阅读全文>>

标签: mv tar shell linux.rm fork

评论(0) 浏览(6003)

Linux运维人员必会开源运维工具体系

2016-3-9 杜世伟 Linux

Linux运维人员必会开源运维工具体系

说明:不同的技术人员,在不同的阶段确定知识边界非常重要,否则,虽然是千里马,但是不知道终点在哪,最终累死也达不到目标。

新手必会用深黄色标记,老鸟必会深黄色+浅蓝色标记

==============================================

操作系统:Centos,Ubuntu,Redhat,suse,Freebsd

网站服务:nginx,apache,lighttpd,php,tomcat,resin
数据   库:MySQL,MariaDB,PostgreSQL

阅读全文>>

标签: linux rpm yum shell python go

评论(0) 浏览(7437)

linux ansible 常用模块

2015-11-20 杜世伟 ansible

ansible 常用模块

一、ping模块

测试主机是否是通的,用法很简单,不涉及参数:

# ansible 192.168.8.12 -m ping
192.168.8.12 | success >> {
    "changed": false,
    "ping": "pong"
}
二、setup模块

setup模块,主要用于获取主机信息,在playbooks里经常会用到的一个参数gather_facts就与该模块相关。setup模块下经常使用的一个参数是filter参数,具体使用示例如下(由于输出结果较多,这里只列命令不写结果):

# ansible 192.168.8.12 -m setup -a 'filter=ansible_*_mb'   //查看主机内存信息
# ansible 192.168.8.12 -m setup -a 'filter=ansible_eth[0-2]'   //查看地接口为eth0-2的网卡信息
# ansible all -m setup --tree /tmp/facts   //将所有主机的信息输入到/tmp/facts目录下,每台主机的信息输入到主机名文件中(/etc/ansible/hosts里的主机名)

阅读全文>>

标签: linux shell python ansible

评论(0) 浏览(12967)

ansible 安装配置与使用

2015-10-20 杜世伟 ansible

ansible安装配置与简单使用
前言:

AnsibleWorks成立于2012年,由自动化工具Cobbler及Func的开发者Michael DeHaan创建。其Ansible平台是一个开源的配置及计算机管理平台。可实现多节点的软件部署,执行特定任务并进行配置管理。

Ansible 跟其他IT自动化技术的区别在于其关注点并非配置管理、应用部署或IT流程工作流,而是提供一个统一的界面来协调所有的IT自动化功能,因此 Ansible的系统更加易用,部署更快。受管理的节点无需安装额外的远程控制软件,由平台通过SSH(Secure SHell)对其进行管理,因此十分方便。其模块支持JSON等标准输出格式,可采用任何编程语言重写。

Ansible可以让用户避免编写脚本或代码来管理应用,同时还能搭建工作流实现IT任务的自动化执行。IT自动化可以降低技术门槛及对传统IT的依赖,从而加快项目的交付速度。

ansible有如下优点:       
1、轻量级,他不需要去客户端安装agent,更新时,只需要在操作机上进行一次更新即可        
2、批量任务执行可以写成脚本,而且不用分发到远程就可以执行        
3、使用python编写的,维护更简单        
4、支持sudo

阅读全文>>

标签: linux shell python ansible

评论(0) 浏览(12809)

linux中输入输出的标准文件描述符

2015-7-6 杜世伟 Linux

#!/bin/bash
#linux中输入输出的标准文件描述符。
#linux将对象当做文件来处理,并用标准文件描述符来表示每个文件对象。每一个文件描述符都可以标识一个会话中打开的文件。
#每个过程中最多可以有9个文件描述符,其中前三个被bash shell指定用于特殊用途

#文件描述符 缩写 描述
#0 STDIN 标准输入
#1 STDOUT 标准输出
#2 STDERR 标准错误
#对于一个终端来讲,标准输入STDIN就是键盘、标准输出STDOUT和标准错误STDERR就是屏幕
#我们可以通过重定向符(<,>)来改变输入、输出和错误。

阅读全文>>

标签: linux shell

评论(0) 浏览(16169)

shell 算术运算操作

2015-6-2 杜世伟 Linux

算术运算符指的是可以在程序中实现加、减、乘、除等数学运算的运算符。
Shell中常用的数学运算符如下所示。
 +:对两个变量做加法。
 -:对两个变量做减法。
 *:对两个变量做乘法。
 /:对两个变量做除法。
 **:对两个变量做幂运算。
 %:取模运算,第一个变量除以第二个变量求余数。
 +=:加等于,在自身基础上加第二个变量。
 -=:减等于,在第一个变量的基础上减去第二个变量。
 *=:乘等于,在第一个变量的基础上乘以第二个变量。
 /=:除等于,在第一个变量的基础上除以第二个变量。
 %=:取模赋值,第一个变量对第二个变量取模运算,再赋值给第一个变量。

阅读全文>>

标签: linux shell

评论(0) 浏览(9725)

shell脚本基本IF条件判断和判断条件总结

2015-4-30 杜世伟 Linux

1、基本语法:
if [ command ]; then
符合该条件执行的语句
fi
2、扩展语法:
if [ command ];then
符合该条件执行的语句
elif [ command ];then
符合该条件执行的语句
else
符合该条件执行的语句
fi

3、语法说明:
bash shell会按顺序执行if语句,如果command执行后且它的返回状态是0,则会执行符合该条件执行的语句,否则后面的命令不执行,跳到下一条命令。
当有多个嵌套时,只有第一个返回0退出状态的命令会导致符合该条件执行的语句部分被执行,如果所有的语句的执行状态都不为0,则执行else中语句。
返回状态:最后一个命令的退出状态,或者当没有条件是真的话为0。

阅读全文>>

标签: linux shell

评论(0) 浏览(15049)

Powered by emlog 沪ICP备2023034538号-1