这并不是什么先进技术,mdev、udev是Linux已经使用多年的热插拔通知方案,但我想说的是,作为一个初学者,想实现自己的想法并不是那么容易。其实我写脚本已不是一次两次了,但每次写脚本都要费很长时间,总结原因有几点:

1、脚本不像编译语言,没有编译器帮你在执行前发现语法层的错误,只能运行时发现。

2、脚本调试不方便,基本只能靠echo打印得知变量的值或者程序运行到哪,虽然有可以在开头加-xv自动打印每一步的情况,但脚本一大或者变量复杂的话,打印的信息太多,也不好定位。关键是有些情况系就是打印不出信息,这就真没辙了。

3、背景知识需要太多,而且没有像ANSI C库函数一样的全面介绍命令的书(至少我还没找到),加上有很多命令用法复杂,参数变化多样,命令命名不规范,不好猜,使得初学者处处碰壁,虽然man可以告诉我们很多信息,但是必须是知道有这个命令的前提下,如果压根就不知道有这个命令,man实在没什么用。尤其是该死的正则表达式,规则复杂还经常用,简直是初学者的天敌。还有那/proc里的东西,我就想知道那本书里将它?!

4、消息封锁。google上不去,要么翻墙,还没有稳定、免费的翻墙法,baidu又不争气,找到的文章基本千篇一律。zf屏蔽google简直就是阻碍科学发展!

我就为实现一个像Windows中的autorun一样的功能,花了3天的时间,于是决心写此文记录。

mdev我就不多介绍了,网上有的是。让它执行一个脚本的方法也很简单,传统的做法是在/etc/mdev.conf中添加如下语句:

sd[a-z][0-9] 0:6 0660*/etc/automount.sh

这里的*可以换成@,表示只有插上u盘时执行/etc/automount.sh,当然,这样就需要配合$,表示卸载U盘时执行什么脚本。这都不重要,关键是/etc/automount.sh的写法。

#!/bin/sh

destdir=/udisk
app=myscript
#echo "$0 $ACTION $MDEV"

my_umount()
{
umount "$destdir";
rmdir "$destdir"
}

my_mount()
{
mkdir "$destdir" || true
  mount -t vfat -o sync -o noatime -o nodiratime "/dev/$1" "$destdir" || true
}

run_script()
{
HACKPATH=${destdir}/$1
if [ -e $HACKPATH ]; then
/bin/chmod u+x $HAKPATH 2>&1
exec $HACKPATH &
fi
}

kill_script()
{
  NAME=$1
#  echo $NAME
  ID=`ps -ef | grep "$NAME" | grep -v "$0" | grep -v "grep" | awk '{print $1}'`#网上都是print $2,但我试的就是$1
  echo $ID
  for id in $ID
  do
  pkill -P $id #这个命令用于干掉所有因NAME引发的进程
#  echo "killed $id"
  done
}

case "${ACTION}" in
remove)
        my_umount        
        kill_script $app
        ;;
add|"")
echo "i'm in ${ACTION}"#不知为什么,这里就是打印不出来
my_mount ${MDEV}
run_script $app
;;
esac

剩下的事你也应该知道了,在U盘里放一个myscript文件,里面写着你要执行的脚本,注意添加可执行权限。当你插上U盘时就会自动执行你的脚本了。

这里还有一些不足,就是拔出u盘时总是umount失败,但我始终找不到原因,还请过路的大神指教,在此先谢过。

Logo

更多推荐