Linux编程细节2-脚本

时间:2022-10-09 04:42:02

1,linux小功能

1.1,如何创建一个linux回收站

方法1:
mkdir /tmp/trash_tmp 建立一个回收站目录
vi /bin/trash 编辑一个文件
mv $@ /tmp/trash_tmp
:wq保存退出
alias rm=/bin/trash添加别名
vi /etc/bashrc
在最后一行添加alias rm=/bin/trash
chmod 755 /bin/trash
chmod 777 /tmp/trash_tmp
source /etc/bashrc 启用环境变量

如果要真的删除某个文件的时候用 /bin/rm -i file_name
方法2:
建立回收站: mkdir -p ~/.trash  然后在~/.bashrc中加入:
alias rm=trash
alias rl='ls ~/.trash'
alias ru=removeundo
alias rc=cleartrash
removeundo()
{
mv -i ~/.trash/$@ ./
}
trash()
{
mv -i $@ ~/.trash/
}
cleartrash()
{
read -p "clear sure? [y|n]" confirm
[ $confirm == 'y' ] || [ $confirm == 'Y' ] && /bin/rm -rf ~/.trash/*
}
其中mv -i表示提示是否需要覆盖文件。
其中没有做的是不能讲内容恢复到原来地点,需要记录删除时的这种信息。
方法3:
或者更直接点:
alias rm='mv $@ ~/backup'

1.2 如何删除目录下一周内未访问过的所有的core文件

test -d /data && find /data -atime +7 -name '*core*'|xargs file| awk -F: '/LSB core file/ {system("rm -f "$1)}' > /dev/null 2>&1

1.3 清空/tmp/下的log和error文件

rm -fr /tmp/*log* /tmp/*error* > /dev/null 2>&1

1.4 脚本,每天创建一个目录

#/bin/bash
today=`date '+%Y%m%d'`
[ ! -d $today ] && mkdir $today
用户性crontab中:
crontab -e
59 23 * * 0,1,2,3,4 /data/home/shellge/cwork/makeTodayDir.sh


1.5 fork炸弹

fork炸弹-*
以下程序段就是由Jaromil所作的在类UNIX系统的shell环境下触发fork炸弹的shell脚本代码,总共只用了13个字符(包括空格):
:(){ :|:& };:
注释如下:
:()      # 定义函数,函数名为":",即每当输入":"时就会自动调用{}内代码
{ # ":"函数开始标识
: # 用递归方式调用":"函数本身
| # 并用管道(pipe)将其输出引至...(因为有一个管道操作符,因此会生成一个新的进程)
: # 另一次递归调用的":"函数
# 综上,":|:"表示的即是每次调用函数":"的时候就会生成两份拷贝
& # 调用间脱钩,以使最初的":"函数被杀死后为其所调用的两个":"函数还能继续执行
} # ":"函数结束标识
; # ":"函数定义结束后将要进行的操作...
: # 调用":"函数,"引爆"fork炸弹
其中函数名“:”只是简化的一例,实际实现时可以随意设定,一个较易理解(将函数名替换为“forkbomb”)的版本如下:
forkbomb(){ forkbomb|forkbomb & } ; forkbomb
解决:可以修改配置文件/etc/security/limits.conf来限制可生成的最大进程数来避开这枚炸弹。

1.6 如何实现并行脚本

我们可以用ping命令编写脚本来查询一组IP地址,检查他们是否属于活动状态。顺序式程序
#!bin/bash
# Filename:ping.sh
for ip in 192.168.0.{1..255};
do
ping $ip -c 2 &> /dev/null;

if [ $? -eq 0 ];
then
echo $ip is alive
fi
done
其中-c表示将发送echo的分组数量限制为2.由于这是顺序式程序,所以很慢。
并行式程序
#!bin/bash
# Filename:ping.sh
for ip in 192.168.0.{1..255};
do
(
ping $ip -c 2 &> /dev/null;

if [ $? -eq 0 ];
then
echo $ip is alive
fi
)&
done
wait
并行的方法是将循环体放入( )&中。( )中的命令作为子shell来运行,而&会将其置入后台。这样for循环中执行了多个后台进程,要想等到所有的子进程结束之后再终止脚本,就要使用wait命令。将wait放在脚本最后,它就会一直等到所有的子脚本进程全部结束。