您的位置:首页 > 其它

用mdev使U盘中的脚本自动执行

2015-11-21 15:18 302 查看
这并不是什么先进技术,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失败,但我始终找不到原因,还请过路的大神指教,在此先谢过。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: