
本周我们学习了如何使用Linux编辑脚本程序,当我们编写好脚本的时候,我们需要返回终端界面,使用各种编译器运行程序,但是有时候我们需要在系统开机的时候就自动运行这些程序,下面我们就来看一下在Linux下将脚本设定成开机自动运行的方法。
Linux在启动时,会自动执行/etc/rcd目录下的初始化程序,因此我们可以把启动任务放到该目录下。假设我们需要运行的脚本文件是test1目录下的testpy。
在系统中找到/etc/rclocal文件,系统会根据该文件来启动所指定的脚本或命令。
我们需要用超级用户登录,并在上述文件最后添加需要运行的脚本文件。
随后cd /home/test1返回test1目录以对其进行更改。
su test1 -c "python /home/test1/testpy" --把要执行的命令作为一个参数传递级su
下面我们就可以实现这个脚本的开机自动运行。
阅读之前建议先看一下附图。本文中假设inittab中设置的init tree为:/etc/rcd/rc0d /etc/rcd/rc1d /etc/rcd/rc2d /etc/rcd/rc3d /etc/rcd/rc4d /etc/rcd/rc5d /etc/rcd/rc6d /etc/rcd/initd1 关于Linux的启动init是所有进程之父 init读取/etc/inittab,执行rcsysinit脚本 (注意文件名是不一定的,有些unix甚至会将语句直接写在inittab中) rcsysinit脚本作了很多工作: init $PATH config network start swap function set hostname check root file system, repair if needed check root space rcsysinit根据inittab执行rcd脚本 Linux是多用户系统,getty是多用户与单用户的分水岭 在getty之前运行的是系统脚本2 关于rcd所有启动脚本放置在 /etc/rcd/initd下 rc number决定执行的顺序3 启动脚本示例这是一个用来启动>
顶你个肺,一看就很菜,甚至比我还菜。
chkconfig调用的服务是在/etc/initd下面的东东,而这些东东都是在启动过程中搞的。
/etc/rcd/rclocal这个文件是在系统已经初始化完成就绪之后,才来读这个东东的。这个东东里面的东西和系统是否启动没有多大关系。
当然rclocal这个鬼东西貌似只有红帽下面才有,在其它 *** 作系统里面,要想某个附加的东东自动启动,就只能搞脚本在/etc/initd下面,然后再软链接到相应的启动级别目录。
1 开机启动时自动运行程序
Linux加载后, 它将初始化硬件和设备驱动, 然后运行第一个进程init。init根据配置文件继续引导过程,启动其它进程。通常情况下,修改放置在
/etc/rc或
/etc/rcd 或
/etc/rcd
目录下的脚本文件,可以使init自动启动其它程序。例如:编辑/etc/rcd/rclocal 文件(该文件通常是系统最后启动的脚本),在文件最末加上一行“xinit”或“startx”,可以在开机启动后直接进入X-Window。
2 登录时自动运行程序
用户登录时,bash先自动执行系统管理员建立的全局登录script :
/ect/profile
然后bash在用户起始目录下按顺序查找三个特殊文件中的一个:
/bash_profile、
/bash_login、
/profile,
但只执行最先找到的一个。因此,只需根据实际需要在上述文件中加入命令就可以实现用户登录时自动运行某些程序(类似于DOS下的Autoexecbat)。
initrd与initramfs的区别
boot loader装入kernel, 然后kernel需要执行/sbin/init, 读取
这个文件就必须先mount根文件系统, 早期是通过启动时的root=
参数告诉内核根文件系统在哪个设备上, 随着硬件和技术的发展,
现在根文件系统可能位于一个网络存储如NFS上, 可能由于RAID而
散布于多个设备上, 可能位于一个加密设备上需要提供用户名和密码,
这时root=参数就显得不够了 为了应付这种局面, 先后出现两种
机制来作为boot loader装载kernel到真正的/sbin/init执行这个启动
过程的桥梁: initrd和initramfs, 两者有类似的地方, 比如都是
由内核执行其上的某个程序(initrd是/linuxrc, initramfs是/init),
由这个程序决定加载什么驱动以及如何装载根文件系统 下面一点
笔记总结initrd的缺点和initramfs的优点
initrd:
ram disk是一个基于ram的块设备,因此它占据了一块固定的内存,
而且事先要使用特定的工具比如mke2fs格式化,还需要一个文件系统
驱动来读写其上的文件。
如果这个disk上的空间没有用完,这些未用的内存就浪费掉了,并且
这个disk的空间固定导致容量有限,要想装入更多的文件就需要重新
格式化。
由于Linux的块设备缓冲特性, ram disk上的数据被拷贝到page cache
(对于文件数据)和dentry cache(对于目录项), 这个也导致内存浪费
initramfs:
最初的想法是Linus提出的: 把cache当作文件系统装载 他在一个叫
ramfs的cache实现上加了一层很薄的封装, 其它内核开发人员编写了
一个改进版tmpfs, 这个文件系统上的数据可以写出到交换分区, 而且
可以设定一个tmpfs装载点的最大尺寸以免耗尽内存 initramfs就是
tmpfs的一个应用
优点:
(1)tmpfs随着其中数据的增减自动增减容量
(2)在tmpfs和page cache/dentry cache之间没有重复数据
(3)tmpfs重复利用了Linux caching的代码, 因此几乎没有增加内核
尺寸, 而caching的代码已经经过良好测试, 所以tmpfs的代码质量
也有保证
(4)不需要额外的文件系统驱动
另外, initrd机制被设计为旧的"root="机制的前端, 而非其替代物,
它假设真正的根设备是一个块设备, 而且也假设了自己不是真正的根设备,
这样不便将NFS等作为根文件系统, 最后/linuxrc不是以PID=1执行的, 因为
1这个进程ID是给/sbin/init保留的 initrd机制找到真正的根设备后将
其设备号写入/proc/sys/kernel/real-root-dev, 然后控制转移到内核由
其装载根文件系统并启动/sbin/init
initramfs则去掉了上述假设, 而且/init以PID=1执行, 由init装载根文件
系统并用exec转到真正的/sbin/init, 这样也导致一个更为干净漂亮的设计
以上就是关于Linux下开机启动脚本程序全部的内容,包括:Linux下开机启动脚本程序、如何使Linux系统上的程序开机后自动运行、Linux开机启动文件rc.local无法执行怎么办等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)