Linux进程启动方式有哪些

发布时间:2023-02-10 13:49:41 作者:iii
来源:亿速云 阅读:195

Linux进程启动方式有哪些

在Linux系统中,进程是操作系统进行资源分配和调度的基本单位。了解Linux进程的启动方式对于系统管理员和开发人员来说至关重要。本文将详细介绍Linux系统中常见的进程启动方式,包括通过Shell启动、通过系统调用启动、通过守护进程启动、通过定时任务启动等。

1. 通过Shell启动进程

1.1 交互式Shell启动

在Linux系统中,用户通常通过Shell与系统进行交互。Shell是一个命令行解释器,它读取用户输入的命令并执行相应的操作。用户可以通过在Shell中输入命令来启动一个进程。

例如,启动一个简单的ls命令:

ls -l

这个命令会启动一个ls进程,列出当前目录下的文件和目录。

1.2 后台启动进程

在Shell中,用户可以通过在命令末尾添加&符号来将进程放到后台运行。这样,Shell会立即返回提示符,而不会等待进程结束。

例如,启动一个后台进程:

sleep 100 &

这个命令会启动一个sleep进程,并在后台运行100秒。

1.3 使用nohup启动进程

nohup命令用于启动一个进程,并使其在用户退出Shell后仍然继续运行。nohup会将进程的输出重定向到一个文件(默认是nohup.out),以防止输出被中断。

例如,使用nohup启动一个进程:

nohup sleep 100 &

这个命令会启动一个sleep进程,并在后台运行100秒,即使用户退出Shell,进程也不会被终止。

2. 通过系统调用启动进程

2.1 fork()exec()系统调用

在Linux系统中,进程的创建通常通过fork()exec()系统调用来实现。

例如,以下C代码展示了如何使用fork()exec()启动一个新进程:

#include <stdio.h>
#include <unistd.h>

int main() {
    pid_t pid = fork();
    if (pid == 0) {
        // 子进程
        execl("/bin/ls", "ls", "-l", NULL);
    } else if (pid > 0) {
        // 父进程
        printf("Parent process\n");
    } else {
        // fork失败
        perror("fork");
    }
    return 0;
}

这个程序会创建一个子进程,并在子进程中执行ls -l命令。

2.2 system()系统调用

system()是一个库函数,它封装了fork()exec()wait()等系统调用,用于执行一个Shell命令。

例如,以下C代码展示了如何使用system()启动一个新进程:

#include <stdio.h>
#include <stdlib.h>

int main() {
    system("ls -l");
    return 0;
}

这个程序会执行ls -l命令,并等待命令执行完毕。

3. 通过守护进程启动

3.1 什么是守护进程

守护进程(Daemon)是在后台运行的进程,通常不与任何终端关联。守护进程通常用于执行系统任务,如日志记录、网络服务等。

3.2 创建守护进程

创建守护进程通常需要以下步骤:

  1. 调用fork()创建子进程,并退出父进程。
  2. 在子进程中调用setsid()创建一个新的会话。
  3. 改变当前工作目录到根目录。
  4. 关闭所有打开的文件描述符。
  5. 重定向标准输入、标准输出和标准错误到/dev/null

以下是一个简单的守护进程示例:

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

int main() {
    pid_t pid = fork();
    if (pid < 0) {
        perror("fork");
        exit(1);
    }
    if (pid > 0) {
        // 父进程退出
        exit(0);
    }
    // 子进程
    setsid(); // 创建新的会话
    chdir("/"); // 改变工作目录到根目录
    close(STDIN_FILENO); // 关闭标准输入
    close(STDOUT_FILENO); // 关闭标准输出
    close(STDERR_FILENO); // 关闭标准错误
    // 打开/dev/null作为标准输入、输出和错误
    open("/dev/null", O_RDONLY);
    open("/dev/null", O_WRONLY);
    open("/dev/null", O_WRONLY);
    // 守护进程的主循环
    while (1) {
        // 执行守护进程的任务
        sleep(10);
    }
    return 0;
}

这个程序会创建一个守护进程,并在后台每10秒执行一次任务。

4. 通过定时任务启动

4.1 cron定时任务

cron是Linux系统中用于定时执行任务的守护进程。用户可以通过编辑crontab文件来设置定时任务。

例如,编辑当前用户的crontab文件:

crontab -e

在文件中添加以下内容,表示每天凌晨2点执行/path/to/script.sh脚本:

0 2 * * * /path/to/script.sh

4.2 at命令

at命令用于在指定时间执行一次性任务。用户可以通过at命令安排任务在未来的某个时间执行。

例如,安排一个任务在5分钟后执行:

echo "/path/to/script.sh" | at now + 5 minutes

这个命令会在5分钟后执行/path/to/script.sh脚本。

5. 通过系统服务启动

5.1 systemd服务

systemd是Linux系统中用于管理系统服务的守护进程。用户可以通过创建systemd服务单元文件来定义和管理服务。

例如,创建一个名为my_service.service的服务单元文件:

[Unit]
Description=My Custom Service

[Service]
ExecStart=/path/to/my_service
Restart=always

[Install]
WantedBy=multi-user.target

然后,使用以下命令启用并启动服务:

sudo systemctl enable my_service
sudo systemctl start my_service

这个服务会在系统启动时自动启动,并在崩溃时自动重启。

5.2 init脚本

在较老的Linux系统中,init是系统启动时第一个运行的进程,它负责启动其他系统服务。用户可以通过创建init脚本来定义和管理服务。

例如,创建一个名为my_serviceinit脚本:

#!/bin/bash
# chkconfig: 2345 90 10
# description: My Custom Service

case "$1" in
    start)
        /path/to/my_service &
        ;;
    stop)
        killall my_service
        ;;
    *)
        echo "Usage: $0 {start|stop}"
        exit 1
        ;;
esac
exit 0

然后,使用以下命令启用并启动服务:

sudo chkconfig --add my_service
sudo service my_service start

这个服务会在系统启动时自动启动,并可以通过service命令手动管理。

6. 总结

Linux系统中进程的启动方式多种多样,用户可以根据不同的需求选择合适的方式。通过Shell启动进程是最常见的方式,适合交互式操作;通过系统调用启动进程适合编程实现;通过守护进程启动适合后台任务;通过定时任务启动适合周期性任务;通过系统服务启动适合系统级服务。掌握这些启动方式,可以帮助用户更好地管理和控制系统中的进程。

推荐阅读:
  1. 怎么在linux系统中部署一个Spring Boot程序
  2. linux有几种方式实现进程间通信

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

linux

上一篇:linux中yum是什么

下一篇:Vue中的路由使用和多种守卫方法是什么

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》