在Linux系统如何让程序开机时自动启动

系统的服务在开机时一般都可以自动启动,那在linux系统下如果想要程序在开机时自动启动怎么办?我们知道在 windows系统“开始”–>“所有程序”–>“启动”里面放个快捷方式就行,那Linux系统下呢?…系统的服务在开机时一般都可以自动启动,那在linux系统下如果想要程序在开机时自动启动怎么办?我们知道在 windows系统“开始”–>“所有程序”–>“启动”里面放个快捷方式就行,那Linux系统下呢?
这也是一个比较简单的问题,有不少的方法可以解决,这里介绍三种方法。因为是简单介绍,所以具体细节不是很详细,可以通过man看看相关手册。 

一、/etc/rc.local 

这是一个最简单的方法,编辑“/etc/rc.local”,把启动程序的shell命令输入进去即可(要输入命令的全路径),类似于windows下的“启动”。 

使用命令 vi /etc/rc.local 然后在文件最后一行添加要执行程序的全路径。 

例如,每次开机时要执行一个haha.sh,这个脚本放在/opt下面,那就可以在“/etc/rc.local”中加一行“/opt/./haha.sh”,或者两行“cd /opt”和“./haha.sh”。 

二、crontab(类似于windows的任务计划服务)

通过crontab可以设定程序的执行时间表,

例如让程序在每天的8点,或者每个星期一的10点执行一次。

 crontab -l 列出时间表;
crontab -e编辑时间表;
crontab -d删除时间表;

 “-l”没什么可说的,就是一个查看而已; 

“-e”是编辑,和vi没什么差别(其实就是用vi编辑一个特定文件); 

“-d”基本不用,因为它把该用户所有的时间表都删除了,一般都是用“-e”编辑把不要了的时间表逐行删除;

 那到底该如何编辑呢? 

crontab文件的格式是:M H D m d CMD。
一个6个字段,其中最后一个CMD就是所要执行的程序,

如haha.sh。
M:分钟(0-59)
H:小时(0-23)
D:日期(1-31)
m:月份(1-12)
d:一个星期中的某天(0-6,0代表周日)
这5个时间字段用空格隔开,其值可以是一个数字,也可以用逗号隔开的多个数字(或其他) ,如果不需设置,则默认为“*”。

 例如,每天的8点5分执行haha.sh,就是“5 8 * * * /opt/./haha.sh”。
好像和“开机程序自动启动”扯远了,现在回归正题。其实上面介绍的crontab的功能已经具备了开机自动启动的能力,可以写一个监测脚本,每5分钟执行一次(*/5 * * * * ./haha.sh),如果程序不在了就重新启动一次。 

编辑文件

#vi /etc/crontab

重启服务

#service crond restart

三、注册系统服务 操作系统自带的服务,如ssh,ftp等等,开机都是自动启动的,我们也可以通过这种方式让自己开发的程序提高“身价”。
  

比如我想把某个已经安装了的服务添加为系统服务,可以执行以下命令: chkconfig –add 服务名称 (首先,添加为系统服务,注意add前面有两个横杠)   chkconfig -leve 启动级别 服务名 on (说明,3级别代表在命令行模式启动,5级别代表在图形界面启动,on表示开启) chkconfig -leve 启动级别 服务名 off (说明,off表示关闭自启动) 

例如:chkconfig -level 3 mysql on (说明:让mysql服务在命令行模式,随系统启动) 也可以使用   chkconfig –add 服务名称    来删除系统服务  如果要查看哪些服务被添加为系统服务可以使用命令 : ntsysv 或者chkconfig –list   如果要查看哪些程序被添加为自启动,可以使用命令  : cat   /etc/rc.local (查看这个文件中添加了哪些程序路径)

 下面举例说说,如何把一个shell脚本添加为系统服务,并跟随系统启动: 可以看到“/etc/rc.d/init.d”下有很多的文件,每个文件都是可以看到内容的,其实都是一些shell脚本。 

系统服务的启动就是通过“/etc/rc.d/init.d”中的脚本文件实现的。我们也可以写一个自己的脚本放在这里。 

脚本文件的内容也很简单,类似于这个样子(例如起个名字叫做“hahad”): . /etc/init.d/functions start() {
echo “Starting my process ”
cd /opt
./haha.sh
}
stop() {
killall haha.sh
echo “Stoped”
}
写了脚本文件之后事情还没有完,

继续完成以下几个步骤: chmod +x hahad                    

#增加执行权限
chkconfig –add hahad            

 #把hahad添加到系统服务列表
chkconfig hahad on                 

#设定hahad的开关(on/off)
chkconfig –list hahad               

#就可以看到已经注册了hahad的服务 这时候才完成了全部工作。

ANDROID开机启动

当操作系统启动完毕之后会广播一个消息叫ACTION_BOOT_COMPLETED,应用程序可以通过实现BroadcastReceiver接口来监听这个消息,接到消息之后就可以启动程序,一般启动一个后台运行的Service,当然也可以直接启动某个activity.

我们来写个简单的service,以便在接收到系统启动完成的消息之后来启动这个后台执行的service

public class BootStartService extends IntentService {

    public UpdateService(){
        this("app start service");
    }
    public UpdateService(String name) {
        super(name);
    }
 
    @Override
    protected void onHandleIntent(Intent workIntent) {
        //启动
	String arg = workIntent.getStringExtra("arg");
        Log.d("BootStartService", "BootStartService start");
	//...做一些默默无闻的事情
    }
}

实现接口BroadcastReceiver来监听消息

public class BootStartReceiver extends BroadcastReceiver {
    static final String action_boot="android.intent.action.BOOT_COMPLETED";
    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(action_boot)){
            Intent mServiceIntent = new Intent(context, BootStartService.class);
	    mServiceIntent.putExtra("arg", "app start args");
	    context.startService(mServiceIntent);
        }
    }
}

那么代码就已经完成了,记得在AndroidManifest.xml中加入下面的声明

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission>
<receiver android:name="cn.fullstacks.blogapp.BootStartReceiver">
	<intent-filter>
	<action android:name="android.intent.action.BOOT_COMPLETED" />
	<category android:name="android.intent.category.HOME" />
	</intent-filter>
</receiver>
<service android:name="cn.fullstacks.blogapp.BootStartService" android:exported="false"/>

重启之后就会看到你要的效果了

总结

开机启动一般是会启动一个后台的程序而不会启动个界面,这样就太霸道了,在系统管理或者一些安全软件里面会有控制开机启动的地方,那么那里面就会看到你的开机启动项了,如果被禁止掉了,你的这个启动消息就不会受到了,这也就是系统级别的消息过滤,如果说必须要开机启动而不想让其他软件阻止的话,那就是把程序写成安全软件了,这就是流氓的开端。

在一些即时通的软件里或者一些需要接受消息的软件,大部分都会做成开机启动,然后启动一个后台服务监听消息,当服务器推送消息过来之后在通知栏里面显示一条消息,这是最常用的场景了。