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

2023-05-16

文章目录

    • Linux下设置程序开机自启动
      • 1、/etc/rc.local
      • 2、/etc/profile.d/
      • 3、使用 crontab 方式
      • 4、使用 systemd 服务
      • 测试代码

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 所有平台上的java

    如果您想用 java 为 Windows Mac 和 Linux 编写桌面应用程序 那么所有这些代码都相同吗 您只需更改 GUI 即可使 Windows 应用程序更像 Windows 等等 如果不深入细节 它是如何工作的 Java 的卖点之
  • 如何有效截断文件头?

    大家都知道truncate file size 函数 通过截断文件尾部将文件大小更改为给定大小 但是如何做同样的事情 只截断文件的尾部和头部呢 通常 您必须重写整个文件 最简单的方法是跳过前几个字节 将其他所有内容复制到临时文件中 并在完成
  • linux perf:如何解释和查找热点

    我尝试了linux perf https perf wiki kernel org index php Main Page今天很实用 但在解释其结果时遇到了困难 我习惯了 valgrind 的 callgrind 这当然是与基于采样的 pe
  • 添加要在给定命令中运行的 .env 变量

    我有一个 env 文件 其中包含如下变量 HELLO world SOMETHING nothing 前几天我发现了这个很棒的脚本 它将这些变量放入当前会话中 所以当我运行这样的东西时 cat env grep v xargs node t
  • 无法使用 wget 在 CentOS 机器上安装 oracle jdk

    我想在CentOS上安装oracle java jdk 8 我无法安装 java jdk 因为当我尝试使用命令安装 java jdk 时 root ADARSH PROD1 wget no cookies no check certific
  • iptables通过注释删除特定规则

    我需要删除一些具有相同评论的规则 例如 我有带有 comment test it 的规则 所以我可以像这样获得它们的列表 sudo iptables t nat L grep test it 但是我怎样才能删除所有带有注释 测试它 的 PR
  • 有谁知道在哪里定义硬件、版本和序列号。 /proc/cpuinfo 的字段?

    我想确保我的 proc cpuinfo 是准确的 目前它输出 Hardware am335xevm Revision 0000 Serial 0000000000000000 我可以在代码中的哪里更改它以给出实际值 这取决于 Linux 的
  • 如何授予 apache 使用 NTFS 分区上的目录的权限?

    我在一台带有 20GB 硬盘的旧机器上运行 Linux Lubutu 12 10 我有一个 1 TB 外部硬盘 上面有一个 NTFS 分区 在该分区上 有一个 www 目录 用于保存我的网页内容 它在启动时自动安装为 media t515
  • PHP 无法打开流:是一个目录

    非常简单的 PHP 脚本 我在我亲自设置的 Ubuntu Web 服务器上的 EE 模板中运行 我知道这与权限有关 并且我已经将我尝试写入的目录的所有者更改为 Apache 用户 我得到的错误是 遇到 PHP 错误 严重性 警告 消息 fi
  • docker容器大小远大于实际大小

    我正在尝试从中构建图像debian latest 构建后 报告的图像虚拟大小来自docker images命令为 1 917 GB 我登录查看尺寸 du sh 大小为 573 MB 我很确定这么大的尺寸通常是不可能的 这里发生了什么 如何获
  • 查找哪些页面不再与写入时复制共享

    假设我在 Linux 中有一个进程 我从中fork 另一个相同的过程 后forking 因为原始进程将开始写入内存 Linux写时复制机制将为进程提供与分叉进程使用的不同的唯一物理内存页 在执行的某个时刻 我如何知道原始进程的哪些页面已被写
  • 查找哪个程序运行另一个程序

    我有一个 NAS 运行在 Redhat Linux 的有限版本上 我按照指示破解了它 这样我就可以访问 shell 这很有帮助 我还做了一些修改 其他人也做过修改 除了一个问题之外 它们似乎都工作得很好 不知何故 每隔 22 天 系统就会关
  • 在脚本内使用不带密码的 sudo

    由于某种原因 我需要作为用户在没有 sudo 的情况下运行脚本 script sh 该脚本需要 root 权限才能工作 我认为将 sudo 放入 script sh 中是唯一的解决方案 让我们举个例子 script sh bin sh su
  • Linux 上有关 getBounds() 和 setBounds() 的 bug_id=4806603 的解决方法?

    在 Linux 平台上 Frame getBounds 和 Frame setBounds 的工作方式不一致 这在 2003 年就已经有报道了 请参见此处 http bugs java com bugdatabase view bug do
  • 如何使用 GOPATH 的 Samba 服务器位置?

    我正在尝试将 GOPATH 设置为共享网络文件夹 当我进入 export GOPATH smb path to shared folder I get go GOPATH entry is relative must be absolute
  • 在两次之间每分钟执行一次 Cronjob

    我需要在 crontab 中每分钟运行一个 bash 脚本8 45am and 9 50am每天的 Code 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 8 home pull sh gt ho
  • 我如何知道 C 程序的可执行文件是在前台还是后台运行?

    在我的 C 程序中 我想知道我的可执行文件是否像这样在前台运行 a out 或者像这样 a out 如果你是前台工作 getpgrp tcgetpgrp STDOUT FILENO or STDIN FILENO or STDERR FIL
  • 进程退出后 POSIX 名称信号量不会释放

    我正在尝试使用 POSIX 命名信号量进行跨进程同步 我注意到进程死亡或退出后 信号量仍然被系统打开 在进程 打开它 死亡或退出后是否有办法使其关闭 释放 早期的讨论在这里 当将信号量递减至零的进程崩溃时 如何恢复信号量 https sta
  • 监视目录的更改

    很像一个类似的问题 https stackoverflow com questions 112276 directory modification monitoring 我正在尝试监视 Linux 机器上的目录以添加新文件 并希望在这些新文
  • C++ Boost ASIO 简单的周期性定时器?

    我想要一个非常简单的周期性计时器每 50 毫秒调用我的代码 我可以创建一个始终休眠 50 毫秒的线程 但这很痛苦 我可以开始研究用于制作计时器的 Linux API 但它不可移植 I d like使用升压 我只是不确定这是否可能 boost

随机推荐