Linux下如何设置程序的开机自启动功能

Linux下设置程序开机自启动

在最后,我放了我测试时候要开机自启程序的源码逻辑。

1、/etc/rc.local

如果没有该文件,则创建该文件

vim /etc/rc.local

在文件末尾加上你开机需要执行的命令即可(写绝对路径,添加到系统环境变量的除外)

#!/bin/bash

/home/czy/test/test &

可以使用reboot命令重启虚拟机,

[Ubuntu]重启之后会执行/etc/rc.local文件中的脚本

注意:这里的绝大多数操作都是需要在root用户或sudo权限才能操作的

在这里插入图片描述

在此之前,我先看到的一个方法是/etc/rc.d/rc.local

但是这个方法,我怎么都试不成功,如果有人知道怎么设置或知道问题出在哪的话,欢迎指点

在这里插入图片描述
在这里插入图片描述

这里可以看到是没有 test.log 文件生成,也就是程序没有执行

2、/etc/profile.d/

自己写一个shell脚本

将写好的脚本(.sh文件)放到目录

/etc/profile.d/ 

下,系统启动后就会自动执行该目录下的所有shell脚本。

这个和上面/etc/rc.local的区别是,这种设置方法会提示程序已经执行完毕~~~

3、使用 crontab 方式

crond 是 linux 下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与 windows 下的计划任务类似,当安装完成操作系统后,默认会安装此服务 工具,并且会自动启动 crond 进程,crond 进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。

因此我们可以使用 crondtab 命令创建一个任务,让该任务在重启时进行执行。

# crontab -e
//进入编辑,输入如下行
@reboot /home/czy/test/test
//这个路径自己决定就好

//上面我用的是可执行程序,使用脚本当然也是可以的
@reboot /home/czy/test/test.sh

这里可以看到重启前是没有log文件的

reboot 重启后,程序已执行

4、使用 systemd 服务

Systemd 服务是一种以 .service 结尾的单元(unit)配置文件,用于控制由 Systemd 控制或监视的进程。简单说,用于后台以守护进程(daemon)的形式运行程序。

systmd service 文件一般放在/etc/systemd/system/文件夹中。

创建一个服务如下:

//在/etc/systemd/system/下创建一个服务,如下
# vim ser.service

//[Unit] 区块:启动顺序与依赖关系。
//Description字段给出当前服务的简单描述

[Unit]
Description=Run a test Script at Startup

//Service区块定义如何启动当前服务
//ExecStart字段:定义启动进程时执行的命令

[Service]
ExecStart=/home/czy/test/test.sh

//Install区块,定义如何安装这个配置文件,即怎样做到开机启动
//WantedBy字段:表示该服务所在的 Target,Target的含义是服务组,表示一组服务

[Install]
WantedBy=default.target


//更新服务配置文件,并使能服务
# systemctl daemon-reload
# systemctl enable test.service

//重启系统
# reboot

一个问题:

就是service部分如果是执行脚本的话,程序就只执行了一轮

[Service]
ExecStart=/home/czy/test/test.sh

如果service部分ExecStart后面跟的是可执行程序的话,又能正常执行

[Service]
ExecStart=/home/czy/test/test

望各位大佬指点🙏

测试代码

下面是我测试的开机自启程序的源码:

test.c

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main (int argc, char **argv)
{
        int     fd;
        int     i = 10;
        char    *buf = "Automatic startup\n";
        
        fd = open("/home/czy/test/test.log", O_WRONLY|O_CREAT|O_TRUNC, 0666);
        while(i)
        {
                write(fd, buf, strlen(buf));

                i--;
                sleep(1);
        }

        return 0;
}

test.sh

#!/bin/bash

/home/czy/test/test &

参考链接:https://baijiahao.baidu.com/s?id=1722174560616569543&wfr=spider&for=pc

systemd服务:https://blog.csdn.net/wangshui898/article/details/122130726

  • 7
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
要实现开机自动打开 WiFi,你需要修改 Android 源代码中的系统设置应用程序(com.android.settings)。 首先,你需要下载 Android 源代码并进行编译。然后,在源代码中找到 com.android.settings 应用程序的代码。你需要修改的文件是 Settings.java。 在 Settings.java 文件中,你需要添加以下代码: ```java private static final String WIFI_ON_BOOT = "wifi_on_boot"; // 在 onCreate 方法中添加以下代码 Preference wifiOnBoot = findPreference(WIFI_ON_BOOT); wifiOnBoot.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { setWifiOnBoot(((CheckBoxPreference) preference).isChecked()); return true; } }); // 添加以下方法 private void setWifiOnBoot(boolean isChecked) { int flag = isChecked ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED : PackageManager.COMPONENT_ENABLED_STATE_DISABLED; ComponentName receiver = new ComponentName(this, WifiOnBootReceiver.class); PackageManager pm = getPackageManager(); pm.setComponentEnabledSetting(receiver, flag, PackageManager.DONT_KILL_APP); } // 添加以下类 public static class WifiOnBootReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); wifiManager.setWifiEnabled(true); } } ``` 这段代码会在系统设置应用程序的界面上添加一个“开机自动打开 WiFi”的开关。当用户打开开关时,系统会注册一个广播接收器(WifiOnBootReceiver),在系统启动时自动打开 WiFi。 最后,你需要重新编译 Android 系统并将其刷入你的设备。这样,你的设备就会在开机时自动打开 WiFi。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值