Linux启动服务后如何查看并管理对应进程号?

在Linux系统中,服务通常指在后台持续运行、无需用户交互的程序,而进程号(PID,Process ID)是操作系统为每个进程分配的唯一标识符,用于管理进程的生命周期(如终止、监控等),启动服务并获取其PID是系统管理和运维的基础操作,本文将详细介绍通过不同方式启动服务及对应PID的获取方法。

linux如何启动服务进程号

通过systemd管理服务(现代Linux主流方式)

systemd是目前大多数Linux发行版(如Ubuntu 16.04+、CentOS 7+)的默认系统管理器,通过单元文件(.service)定义服务的启动、停止等行为,并支持依赖管理、并行启动等高级功能。

创建/编辑服务文件

服务文件通常位于/etc/systemd/system/目录下,例如创建一个名为myapp.service的服务文件:

[Unit]
Description=My Custom Application
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/myapp
PIDFile=/var/run/myapp.pid
User=myuser
Group=mygroup
Restart=on-failure
[Install]
WantedBy=multi-user.target

关键字段说明:

  • ExecStart:服务启动命令(需绝对路径);
  • PIDFile:指定PID文件路径,systemd通过该文件跟踪主进程PID;
  • User/Group:运行服务的用户和组(需存在);
  • Restart:进程退出后的重启策略(如on-failure表示失败时重启)。

启动服务并获取PID

(1)重载systemd配置(新建/修改服务文件后需执行):

sudo systemctl daemon-reload

(2)启动服务(start为立即启动,enable为开机自启):

sudo systemctl start myapp.service  # 启动服务
sudo systemctl enable myapp.service # 设置开机自启

(3)查看服务状态及PID:

sudo systemctl status myapp.service  # 显示服务状态,包含主进程PID

输出示例:

● myapp.service - My Custom Application
   Loaded: loaded (/etc/systemd/system/myapp.service; enabled; vendor preset: enabled)
   Active: active (running) since [时间]; [时间] ago
 Main PID: 1234 (myapp)
    Tasks: 5 (limit: 1137)
   Memory: 12.3M
   CGroup: /system.slice/myapp.service
           └─1234 /usr/local/bin/myapp

其中Main PID: 1234即为服务主进程的PID。

(4)通过systemd命令直接获取PID:

linux如何启动服务进程号

sudo systemctl show --property MainPID myapp.service
# 输出:MainPID=1234

通过System V init(传统服务管理方式)

在较老的Linux发行版(如CentOS 6、Debian 7)中,仍使用System V init(简称SysV)管理服务,服务脚本通常位于/etc/init.d/目录下。

服务脚本示例

/etc/init.d/myservice为例,脚本需包含startstopstatus等操作:

#!/bin/bash
# chkconfig: 2345 80 20
# description: My custom service
PIDFILE=/var/run/myservice.pid
DAEMON=/usr/local/bin/myservice
start() {
    if [ -f $PIDFILE ]; then
        echo "Service already running (PID: $(cat $PIDFILE))"
        return 1
    fi
    echo "Starting $DAEMON..."
    $DAEMON &
    echo $! > $PIDFILE  # 将后台进程PID写入文件
}
stop() {
    if [ ! -f $PIDFILE ]; then
        echo "Service not running"
        return 1
    fi
    PID=$(cat $PIDFILE)
    echo "Stopping $DAEMON (PID: $PID)..."
    kill $PID
    rm -f $PIDFILE
}
status() {
    if [ -f $PIDFILE ]; then
        PID=$(cat $PIDFILE)
        if ps -p $PID > /dev/null; then
            echo "Service running (PID: $PID)"
        else
            echo "Service not running (stale PID file)"
            rm -f $PIDFILE
        fi
    else
        echo "Service not running"
    fi
}
case "$1" in
    start) start ;;
    stop) stop ;;
    status) status ;;
    restart) stop; start ;;
    *) echo "Usage: $0 {start|stop|status|restart}"
       exit 1
esac

关键点:

  • 脚本需可执行(chmod +x /etc/init.d/myservice);
  • chkconfig行定义运行级别(2345)和启动/停止优先级(80/20);
  • 变量获取后台执行命令的PID,并写入PIDFile

启动服务并获取PID

(1)添加/删除服务(chkconfig管理):

sudo chkconfig --add myservice  # 添加为系统服务
sudo chkconfig myservice on     # 开机自启

(2)启动服务:

sudo service myservice start    # 启动服务
sudo /etc/init.d/myservice start # 也可直接执行脚本

(3)查看服务状态及PID:

sudo service myservice status   # 显示服务状态及PID

输出示例:

Service running (PID: 5678)

(4)通过PID文件获取PID:

cat /var/run/myservice.pid  # 直接读取PID文件内容

直接运行程序(非服务管理方式)

若无需系统级服务管理(如临时测试),可直接通过命令启动程序并获取PID。

linux如何启动服务进程号

后台启动方式

(1)&符号:将程序放入后台运行,终端关闭后进程可能终止(需配合nohup避免):

/usr/local/bin/myapp &  # 后台启动,输出默认重定向到终端
echo $!                 # $!获取最后一个后台进程的PID

(2)nohup:忽略挂断信号,程序在终端关闭后仍运行,输出默认写入nohup.out

nohup /usr/local/bin/myapp &  # 后台启动并忽略挂断
echo $!                        # 获取PID

查看PID

(1)ps命令:根据进程名或路径查找PID

ps aux | grep myapp          # 过滤包含"myapp"的进程(注意grep自身也会显示)
ps aux | grep "[m]yapp"      # 使用正则避免匹配grep进程
ps -C myapp                  # 通过进程名查找(需精确)
ps -ef | grep /usr/local/bin/myapp  # 通过完整路径查找

(2)pgrep命令:更简洁地根据进程名、用户等查找PID

pgrep myapp                  # 查找所有名为"myapp"的进程PID
pgrep -u myuser myapp        # 查找用户"myuser"的"myapp"进程PID
pgrep -f "myapp"             # 查找命令行包含"myapp"的进程(模糊匹配)

常用命令对比表

场景 systemd方式 System V init方式 直接运行方式
启动服务 systemctl start 服务名.service service 服务名 start 程序名 &nohup 程序名 &
查看服务状态及PID systemctl status 服务名 service 服务名 status ps aux | grep 程序名
获取PID(命令行) systemctl show --property MainPID cat /var/run/服务名.pid echo $!pgrep 程序名
开机自启 systemctl enable 服务名.service chkconfig 服务名 on 需手动配置(如crontab)

相关问答FAQs

问题1:为什么systemctl status显示服务运行,但用ps aux | grep却找不到对应的进程?
解答:可能的原因包括:

  • 服务配置为Type=forking(旧式服务),主进程会退出,子进程作为实际服务运行,此时MainPID为子进程PID,但进程名可能与服务名不同;
  • 服务未正确生成PID文件(如PIDFile路径错误或程序未写入PID);
  • 进程已被终止但systemd未更新状态(可通过systemctl reset-failed 服务名重置)。
    建议使用systemctl show --property MainPID确认PID,或检查journalctl -u 服务名查看日志。

问题2:如何让服务启动后自动将PID记录到指定文件,方便其他程序调用?
解答:在systemd服务文件的[Service]段中添加PIDFile字段,并确保程序启动后能生成该文件。

[Service]
ExecStart=/path/to/program --daemon
PIDFile=/var/run/program.pid

若程序本身不生成PID文件,可在ExecStart后通过命令写入,

ExecStart=/bin/sh -c '/path/to/program & echo $! > /var/run/program.pid'

配置完成后,执行systemctl daemon-reload && systemctl restart 服务名,即可通过cat /var/run/program.pid获取PID。

原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/28494.html

(0)
酷番叔酷番叔
上一篇 2025年9月22日 20:08
下一篇 2025年9月22日 20:21

相关推荐

  • Mac用户想在Mac上安装Linux系统,具体操作步骤是怎样的?

    在Mac设备上安装Linux系统是许多开发者和技术爱好者的常见需求,无论是为了开发环境搭建、学习Linux操作,还是体验开源系统的灵活性,由于Mac硬件架构分为Intel(x86_64)和Apple Silicon(ARM64,如M1/M2芯片),安装方法略有差异,本文将分场景详细介绍安装步骤、注意事项及工具选……

    2025年8月23日
    3400
  • Linux如何切换回桌面?操作步骤与快捷键有哪些?

    在Linux系统中,“切换回桌面”这一操作可能涉及多种场景,比如从命令行终端返回图形界面、在多个虚拟终端间切换至图形桌面、或是在图形界面内快速返回主桌面等,不同Linux发行版、桌面环境(如GNOME、KDE、XFCE等)及系统配置下,操作方式可能存在差异,本文将结合常见场景,详细说明Linux系统中切换回桌面……

    2025年10月6日
    800
  • 给电脑安装Linux系统时,硬盘分区正确步骤和方法该如何操作?

    在给电脑安装Linux系统时,分区是关键步骤,合理的分区规划能提升系统稳定性和后续管理效率,以下是详细操作流程及注意事项:安装前的准备工作分区前需完成基础准备,避免操作中断或数据丢失,备份重要数据:Linux安装过程中会修改硬盘分区表,若操作不当可能导致原有数据丢失,建议提前将C盘、D盘等重要文件备份至移动硬盘……

    2025年8月21日
    3400
  • 如何快速查看服务是否在运行?

    在Linux系统中启动RMC(Resource Monitoring and Control)服务是管理IBM Power Systems硬件资源的关键步骤,以下是详细操作指南,适用于主流Linux发行版(如Red Hat Enterprise Linux、SUSE Linux Enterprise Serve……

    2025年8月5日
    3800
  • Linux中如何从图形界面或其他程序详细回到终端命令的操作方法?

    在Linux操作系统中,终端命令行是与系统交互的核心方式,无论是系统管理、软件开发还是日常操作,都离不开终端的高效使用,在使用过程中,用户可能会遇到需要“回到终端命令”的场景——例如从图形界面切换到终端、从后台任务恢复终端、从全屏模式退出、或从无响应状态恢复终端等,本文将详细讲解不同场景下回到终端命令的方法,帮……

    2025年10月5日
    1400

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-880-8834

在线咨询: QQ交谈

邮件:HI@E.KD.CN

关注微信