0

0

如何在Linux中用户服务 Linux systemctl用户模式

P粉602998670

P粉602998670

发布时间:2025-09-01 10:33:01

|

670人浏览过

|

来源于php中文网

原创

使用systemctl --user可管理用户级服务,无需root权限,服务随用户登录启动、退出停止,适用于个人后台任务、开发环境及自动化脚本,配置文件位于~/.config/systemd/user/,通过enable实现开机自启,与系统服务隔离,安全且灵活。

如何在linux中用户服务 linux systemctl用户模式

在Linux中,如果你想管理那些只为你自己运行,不依赖于root权限,并且在你登录时启动、退出时停止的服务,那么

systemctl --user
就是你的不二之选。它提供了一种强大且优雅的方式来控制用户会话内的进程,让你的个人工作流更加自动化和可控。

解决方案

要管理Linux中的用户服务,核心就是使用

systemctl --user
命令。这个命令集与系统级的
systemctl
非常相似,但其作用范围仅限于当前登录用户的会话。

你可以通过以下基本命令来操作用户服务:

  • 启动服务:
    systemctl --user start <服务名>.service
  • 停止服务:
    systemctl --user stop <服务名>.service
  • 重启服务:
    systemctl --user restart <服务名>.service
  • 查看服务状态:
    systemctl --user status <服务名>.service
  • 启用服务(开机自启):
    systemctl --user enable <服务名>.service
  • 禁用服务(取消开机自启):
    systemctl --user disable <服务名>.service
  • 列出所有用户服务:
    systemctl --user list-units --type=service
  • 重新加载systemd配置(当你修改了服务文件后):
    systemctl --user daemon-reload

服务文件通常存放在

~/.config/systemd/user/
目录下。例如,如果你有一个名为
my-app.service
的服务,你需要将它放在这个路径下。

systemctl --user 与普通 systemctl 有何根本区别?

这确实是一个很多人初次接触时会感到困惑的地方,包括我自己。最核心的区别在于它们的作用域和权限。普通的

systemctl
(不带
--user
)管理的是系统范围的服务,这些服务通常由root用户运行,或者以特定系统用户(如
nginx
mysql
)的身份运行,并且在系统启动时就开始,在系统关闭时才停止。它们是整个操作系统的基础设施。

systemctl --user
,顾名思义,管理的是用户会话级别的服务。这意味着:

  1. 权限限制: 你不需要root权限就能管理这些服务。它们以你当前用户的身份运行,权限也仅限于你的用户权限范围。这极大地提升了安全性,避免了不必要的权限提升。
  2. 生命周期: 用户服务通常在你登录时启动,并在你退出登录时停止。这与系统服务是独立的,不会因为你注销而影响到其他用户或系统核心功能。当然,你也可以配置它们在用户退出后继续运行(通过
    logind.conf
    中的
    KillUserProcesses=no
    等设置,或者使用
    linger
    ),但这需要额外配置。
  3. 配置文件位置: 系统服务文件通常在
    /etc/systemd/system/
    /usr/lib/systemd/system/
    ,而用户服务文件则在
    ~/.config/systemd/user/
    。这种隔离让用户可以自由定制自己的服务,而不会干扰系统。
  4. 隔离性: 用户服务是彼此隔离的。一个用户的服务不会影响到另一个用户的服务,也不会影响到系统级的服务。我个人觉得这种隔离性对于开发环境或者需要运行多个独立实例的场景特别有用。

简单来说,如果你想让一个程序在后台为你个人工作,不需要root权限,并且与你的登录状态关联,那么

systemctl --user
就是最优雅、最安全的方式。

如何创建和管理自己的用户服务?

创建用户服务比你想象的要简单,我个人觉得它比写

init.d
脚本或者复杂的
rc.local
要清晰得多。关键在于编写一个
.service
文件。

假设你想创建一个服务来运行一个Python脚本,比如一个定时抓取天气信息的脚本

~/scripts/weather_fetcher.py

第一步:创建服务文件

~/.config/systemd/user/
目录下创建一个名为
weather-fetcher.service
的文件(如果目录不存在,请先创建)。

DM6在线读报系统
DM6在线读报系统

DM6在线读报系统ASPX 免费版2.0。如果您是一个DM广告公司的网站管理员,正在寻求一套程序或源码可以让公司网站具有一套配合网站整体架构的电子杂志频道,那您现在可找对了。请仔细阅读以下关于DM6在线读报系统的说明。 这是一个网站用户可以直接在线阅读报纸且无需插件(连Flash都不用)、无需下载、无需安装的在线读报系统(服务器端模块),通过将此系统放到网站文件目录中即可轻松生成网站的在线读报频道

下载
[Unit]
Description=My personal weather data fetcher
After=network-online.target

[Service]
ExecStart=/usr/bin/python3 /home/yourusername/scripts/weather_fetcher.py
Restart=on-failure
RestartSec=5s
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=default.target

文件内容解释:

  • [Unit]
    部分:
    • Description
      : 服务的简短描述。
    • After=network-online.target
      : 表示这个服务应该在网络可用之后再启动。这对于需要网络连接的服务非常重要。
  • [Service]
    部分:
    • ExecStart
      : 定义了服务启动时执行的命令。请务必使用绝对路径。
      yourusername
      需要替换成你的实际用户名。
    • Restart=on-failure
      : 如果服务异常退出,systemd会自动尝试重启它。
      on-failure
      是一个很好的默认值。
    • RestartSec=5s
      : 如果服务重启,等待5秒后再尝试。
    • StandardOutput=journal
      StandardError=journal
      : 将服务的标准输出和标准错误重定向到systemd日志(
      journalctl --user -u weather-fetcher.service
      可以查看)。这对于调试非常有用,我强烈建议这么做。
  • [Install]
    部分:
    • WantedBy=default.target
      : 定义了当用户启用这个服务时,它应该被哪个目标(target)所依赖。
      default.target
      通常意味着在你登录时启动。

第二步:重新加载systemd配置

在你修改或添加了服务文件后,需要让systemd重新读取配置:

systemctl --user daemon-reload

第三步:启动和启用服务

现在你可以启动你的服务了:

systemctl --user start weather-fetcher.service

并检查它的状态:

systemctl --user status weather-fetcher.service

如果你希望这个服务在你每次登录时自动启动,你需要启用它:

systemctl --user enable weather-fetcher.service

就这样,你的个人服务就跑起来了。管理起来也比以前那些复杂的脚本方便太多了。

用户服务在什么场景下特别有用?

我发现

systemctl --user
在很多日常和开发场景中都异常实用,它填补了
cron
和系统服务之间的一个空白。

  1. 个人开发环境管理: 想象一下,你有一个本地的开发服务器(比如Node.js、Python Flask/Django),或者一个自定义的数据库实例,你希望它们在你登录后自动启动,并保持运行。使用用户服务,你可以轻松地将它们作为后台进程管理,而不需要每次都手动启动,也不需要root权限。我经常用它来管理一些测试用的Redis或MongoDB实例。
  2. 后台脚本或工具 比如你写了一个脚本,用于监控某个目录的变化,或者定期同步一些文件,或者像上面例子中的天气抓取器。这些都是长时间运行的、与你个人工作流紧密相关的任务,用
    systemctl --user
    来管理简直是完美。它比
    nohup
    screen
    /
    tmux
    更健壮,因为systemd会负责重启。
  3. 桌面环境组件: 有些用户可能有一些自定义的桌面组件、通知服务或者输入法守护进程,希望它们在图形界面启动后自动运行。虽然很多桌面环境有自己的自启动机制,但
    systemctl --user
    提供了一个更统一、更强大的管理方式。
  4. 非root用户的服务部署: 在共享主机或没有root权限的环境下,如果你想运行一个需要长期运行的应用程序(比如一个个人网站的后端),
    systemctl --user
    是你的救星。你可以在自己的用户目录下部署服务,并用它来管理其生命周期。
  5. 替代用户crontab的部分功能: 虽然
    cron
    很强大,但对于需要持续运行的守护进程,或者需要更复杂重启策略的服务,
    systemctl --user
    提供了更好的控制和日志记录。你甚至可以用
    Timer
    单元来替代
    cron
    ,它与
    systemctl --user
    配合得天衣无缝。

总的来说,任何需要在你登录后自动运行、保持后台运行、并且不需要系统级权限的个人应用程序或脚本,都可以考虑用

systemctl --user
来管理。它让你的Linux体验更顺滑,也更符合“一切皆服务”的现代理念。

相关专题

更多
python开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

772

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

663

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

765

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

699

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1385

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

570

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

579

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

751

2023.08.11

c++空格相关教程合集
c++空格相关教程合集

本专题整合了c++空格相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 1.9万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 807人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号