Linux系统中的进程管理工具SystemD介绍

SystemD是Linux下的一种init软件,由Lennart Poettering带头开发,并在LGPL 2.1及其后续版本许可证下开源发布。Lennart是redhat员工,但SystemD不是redhat项目。其开发目标是提供更优秀的框架以表示系统服务间的依赖关系,并依此实现系统初始化时服务的并行启动,同时达到降低Shell的系统开销的效果,最终代替现在常用的System V与BSD风格init程序。
SystemD这一名字源于Unix中的一个惯例:在Unix中常以“d”作为系统守护进程(英语:daemon,亦称后台进程)的后缀标识。除此以外,SystemD亦是借代英文术语D体系,而这一术语即是用于描述一个人具有快速地适应环境并解决困难的能力。
SystemD被设计用来改进SysVinit的缺点,与Ubuntu的upstart形成技术竞争。SystemD的很多概念来源于苹果的launchd。目标是尽可能启动更少进程;尽可能将更多进程并行启动(这是性能优于SysVinit的理念基础)。SystemD尽可能减少对Shell脚本的依赖。传统SysVinit使用inittab来决定运行哪些Shell脚本,大量使用Shell脚本被认为是效率低下无法并行的原因。SystemD使用了Linux专属技术,不再顾及POSIX兼容,只要能满足社会变革的需要,突破一些可能过时的技术约束,这也是当今创信理念的需要,相信市场会给出评判。
与多数发行版使用的System V风格init相比,SystemD采用了以下新技术:
采用Socket激活式与总线激活式服务,以提高相互依赖的各服务的并行运行性能;
用cgroups代替PID来追踪进程,因此即使是两次fork之后生成的守护进程也不会脱离systemd的控制。
从设计构思上说,由于SystemD使用了cgroup与fanotify等组件以实现其特性,所以只适用于Linux。有鉴于此,基于kFreeBSD分支的软件源无法纳入SystemD。
大多数主流发行版要么已经采用 Systemd,要么即将在下个发布中采用(如 Debian 和 Ubuntu)。在本教程中,我们使用 Fedora 21(该发行版已经是 Systemd 的优秀实验场地)的一个预览版进行演示,但不论您用哪个发行版,要用到的命令和注意事项都应该是一样的。这是 Systemd 的一个加分点:它消除了不同发行版之间许多细微且琐碎的区别。
在终端中输入 ps ax | grep systemd,看到第一行,其中的数字 1 表示它的进程号是1,也就是说它是 Linux 内核发起的第一个程序。因此,内核一旦检测完硬件并组织好了内存,就会运行 /usr/lib/systemd/systemd 可执行程序,这个程序会按顺序依次发起其他程序。(在还没有 Systemd 的日子里,内核会去运行 /sbin/init,随后这个程序会在名为 SysVinit 的系统中运行其余的各种启动脚本。)
Systemd 的核心是一个叫单元 unit的概念,它是一些存有关于服务service(在运行在后台的程序)、设备、挂载点、和操作系统其他方面信息的配置文件。Systemd 的其中一个目标就是简化这些事物之间的相互作用,因此如果你有程序需要在某个挂载点被创建或某个设备被接入后开始运行,Systemd 可以让这一切正常运作起来变得相当容易。(在没有 Systemd 的日子里,要使用脚本来把这些事情调配好,那可是相当丑陋的。)要列出您 Linux 系统上的所有单元,输入以下命令:
复制代码
代码如下:
systemctl list-unit-files
现在,systemctl 是与 Systemd 交互的主要工具,它有不少选项。在单元列表中,您会注意到这儿有一些格式化:被使能enabled的单元显示为绿色,被禁用disabled的显示为红色。标记为“static”的单元不能直接启用,它们是其他单元所依赖的对象。若要限制输出列表只包含服务,使用以下命令:
复制代码
代码如下:
systemctl list-unit-files --type=service
注意,一个单元显示为“enabled”,并不等于对应的服务正在运行,而只能说明它可以被开启。要获得某个特定服务的信息,以 GDM (Gnome Display Manager) 为例,输入以下命令:
复制代码
代码如下:
systemctl status gdm.service
这条命令提供了许多有用的信息:一段给人看的服务描述、单元配置文件的位置、启动的时间、进程号,以及它所从属的 CGroups(用以限制各组进程的资源开销)。
如果您去查看位于 /usr/lib/systemd/system/gdm.service 的单元配置文件,您可以看到各种选项,包括要被运行的二进制文件(“ExecStart”那一行),相冲突的其他单元(即不能同时进入运行的单元),以及需要在本单元执行前进入运行的单元(“After”那一行)。一些单元有附加的依赖选项,例如“Requires”(必要的依赖)和“Wants”(可选的依赖)。
此处另一个有趣的选项是:
复制代码
代码如下:
Alias=display-manager.service
当您启动 gdm.service 后,您将可以通过 systemctl status display-manager.service 来查看它的状态。当您知道有显示管理程序 display manager在运行并想对它做点什么,但您不关心那究竟是 GDM,KDM,XDM 还是什么别的显示管理程序时,这个选项会非常有用。
     “目标target”锁定
如果您在 /usr/lib/systemd/system 目录中输入 ls 命令,您将看到各种以 .target 结尾的文件。启动目标 target是一种将多个单元聚合在一起以致于将它们同时启动的方式。例如,对大多数类 Unix 操作系统而言有一种“多用户multi-user”状态,意思是系统已被成功启动,后台服务正在运行,并且已准备好让一个或多个用户登录并工作——至少在文本模式下。(其他状态包括用于进行管理工作的单用户single-user状态,以及用于机器关机的重启reboot状态。)
如果您打开 multi-user.target 文件一探究竟,您可能期待看到的是一个要被启动的单元列表。但您会发现这个文件内部几乎空空如也——其实,一个服务会通过 WantedBy 选项让自己成为启动目标的依赖。因此如果您去打开 avahi-daemon.service, NetworkManager.service 及其他 .service 文件看看,您将在 Install 段看到这一行:
复制代码
代码如下:
WantedBy=multi-user.target
因此,切换到多用户启动目标会使能enable那些包含上述语句的单元。还有其他一些启动目标可用(例如 emergency.target 提供一个紧急情况使用的 shell,以及 halt.target 用于机器关机),您可以用以下方式轻松地在它们之间切换:
复制代码
代码如下:
systemctl isolate emergency.target
在许多方面,这些都很像 SysVinit 中的运行级 runlevel,如文本模式的 multi-user.target 类似于第3运行级,graphical.target 类似于第5运行级,reboot.target 类似于第6运行级,诸如此类。
     开启与停止
现在您也许陷入了沉思:我们已经看了这么多,但仍没看到如何停止和开启服务!这其实是有原因的。从外部看,Systemd 也许很复杂,像野兽一般难以驾驭。因此在您开始摆弄它之前,有必要从宏观的角度看看它是如何工作的。实际用来管理服务的命令非常简单:
复制代码
代码如下:
systemctl stop cups.service
systemctl start cups.service
(若某个单元被禁用了,您可以先通过 systemctl enable 加上该单元名的方式将其使能。这种做法会为该单元创建一个符号链接,并将其放置在当前启动目标的 .wants 目录下,这些 .wants 目录在/etc/systemd/system 文件夹中。)
还有两个有用的命令是 systemctl restart 和 systemctl reload,后面接单元名。后者用于让单元重新加载它的配置文件。Systemd 的绝大部分都有良好的文档,因此您可以查看手册 (man systemctl) 了解每条命令的细节。
定时器单元:取代 Cron
除了系统初始化和服务管理,Systemd 还染指了其他方面。在很大程度上,它能够完成 cron 的工作,而且可以说是以更灵活的方式(并带有更易读的语法)。cron 是一个以规定时间间隔执行任务的程序——例如清除临时文件,刷新缓存等。
如果您再次进入 /usr/lib/systemd/system 目录,您会看到那儿有多个 .timer 文件。用 less 来查看这些文件,您会发现它们与 .service 和 .target 文件有着相似的结构,而区别在于 [Timer] 段。举个例子:
复制代码
代码如下:
[Timer]
OnBootSec=1h
OnUnitActiveSec=1w
OnBootSec 选项告诉 Systemd 在系统启动一小时后启动这个单元。第二个选项的意思是:自那以后每周启动这个单元一次。关于定时器有大量选项您可以设置,输入 man systemd.time 查看完整列表。
Systemd 的时间精度默认为一分钟。也就是说,它会在设定时刻的一分钟内运行单元,但不一定精确到那一秒。这么做是基于电源管理方面的原因,但如果您需要一个没有任何延时且精确到毫秒的定时器,您可以添加以下一行:
复制代码
代码如下:
AccuracySec=1us
另外, WakeSystem 选项(可以被设置为 true 或 false)决定了定时器是否可以唤醒处于休眠状态的机器。

     日志文件:向 journald 问声好
Systemd 的第二个主要部分是 journal 。这是个日志系统,类似于 syslog 但也有些显著区别。如果您是个 Unix 日志管理模式的粉丝,准备好出离愤怒吧:这是个二进制日志,因此您不能使用常规的命令行文本处理工具来解析它。这个设计决定不出意料地在网上引起了激烈的争论,但它的确有些优点。例如,日志可以被更系统地组织,带有更多的元数据,因此可以更容易地根据可执行文件名和进程号等过滤出信息。
要查看整个 journal,输入以下命令:
复制代码
代码如下:
journalctl
像许多其他的 Systemd 命令一样,该命令将输出通过管道的方式引向 less 程序,因此您可以使用空格键向下滚动,键入/(斜杠)查找,以及其他熟悉的快捷键。您也能在此看到少许颜色,像红色的警告及错误信息。
以上命令会输出很多信息。为了限制其只输出本次启动的消息,使用如下命令:
复制代码
代码如下:
journalctl -b
这就是 Systemd 大放异彩的地方!您想查看自上次启动以来的全部消息吗?试试 journalctl -b -1 吧。再上一次的?用 -2 替换 -1 吧。那自某个具体时间,例如2014年10月24日16:38以来的呢?
复制代码
代码如下:
journalctl -b --since=”2014-10-24 16:38”
即便您对二进制日志感到遗憾,那依然是个有用的特性,并且对许多系统管理员来说,构建类似的过滤器比起写正则表达式而言容易多了。
我们已经可以根据特定的时间来准确查找日志了,那可以根据特定程序吗?对单元而言,试试这个:
复制代码
代码如下:
journalctl -u gdm.service
(注意:这是个查看 X server 产生的日志的好办法。)那根据特定的进程号?
复制代码
代码如下:
journalctl _PID=890
您甚至可以请求只看某个可执行文件产生的消息:
复制代码
代码如下:
journalctl /usr/bin/pulseaudio
若您想将输出的消息限制在某个优先级,可以使用 -p 选项。该选项参数为 0 的话只会显示紧急消息(也就是说,是时候向 $DEITY 祈求保佑了)(LCTT 译注: $DEITY 是一个计算机方面的幽默,DEITY 是指广义上的“神”,$前缀表示这是一个变量),为 7 的话会显示所有消息,包括调试消息。请查看手册 (man journalctl) 获取更多关于优先级的信息。
值得指出的是,您也可以将多个选项结合在一起,若想查看在当前启动中由 GDM 服务输出的优先级数小于等于 3 的消息,请使用下述命令:
复制代码
代码如下:
journalctl -u gdm.service -p 3 -b
最后,如果您仅仅想打开一个随 journal 持续更新的终端窗口,就像在没有 Systemd 时使用 tail 命令实现的那样,输入 journalctl -f 就好了。
     没有 Systemd 的生活?
如果您就是完全不能接受 Systemd,您仍然有一些主流发行版中的选择。尤其是 Slackware,作为历史最为悠久的发行版,目前还没有做出改变,但它的主要开发者并没有将其从未来规划中移除。一些不出名的发行版也在坚持使用 SysVinit 。
但这又将持续多久呢?Gnome 正越来越依赖于 Systemd,其他的主流桌面环境也会步其后尘。这也是引起 BSD 社区一阵恐慌的原因:Systemd 与 Linux 内核紧密相连,导致在某种程度上,桌面环境正变得越来越不可移植。一种折衷的解决方案也许会以 Uselessd (http://uselessd.darknedgy.net) 的形式到来:一种裁剪版的 Systemd,纯粹专注于启动和监控进程,而不消耗整个基础系统。

  • linux甯哥敤鐨绯荤粺宸ュ叿?
    绛旓細鍝叉稕SUM鏈嶅姟鍣ㄧ洃鎺ц蒋浠朵綔涓洪泦涓洃鎺у钩鍙扮被杞欢锛屽畠瀵瑰悇绉峀inux鎿嶄綔绯荤粺鍙互杩涜闆嗕腑銆佺粺涓鐨勭洃鎺э紝瀹冧富瑕佸Linux鐨凜PU浣跨敤鐜囥佸唴瀛樹娇鐢ㄧ巼銆佺鐩樼┖闂翠娇鐢ㄣ杩涚▼绛夎繘琛岀粺涓鐨勭洃鎺с傚湪SUM鏈嶅姟鍣ㄧ洃鎺ц蒋浠朵腑锛屼笉浠呭彲浠ュLinux绯荤粺鍩烘湰鎬ц兘杩涜鐩戞帶锛屽悓鏃惰繕鍙互瀵筁inux涓瀹氱殑闆嗕腑绠$悊锛屾瘮濡傛墽琛孡inux鐨勫懡浠ゃ侀噸鍚疞inux...
  • Linux杩涚▼鍜岀嚎绋嬬殑鍩虹涓绠$悊
    绛旓細鍥.杩涚▼鐘舵 鐜板湪鎴戜滑鏉ョ湅鐪,杩涚▼鍦ㄧ敓瀛樺懆鏈涓殑鍚勭鐘舵佸強鐘舵佺殑杞崲銆備笅闈㈡槸Linux绯荤粺鐨勮繘绋鐘舵佹ā鍨嬬殑鍚勭鐘舵併傜敤鎴风姸鎬:杩涚▼鍦ㄧ敤鎴风姸鎬佷笅杩愯鐨勭姸鎬併    鍐呮牳鐘舵:杩涚▼鍦ㄥ唴鏍哥姸鎬佷笅杩愯鐨勭姸鎬併    鍐呭瓨涓氨缁:杩涚▼娌℃湁鎵ц,浣嗗浜庡氨缁姸鎬,鍙鍐呮牳璋冨害瀹,灏卞彲浠ユ墽琛屻    鍐呭瓨涓潯鐪...
  • linux璋冨害鍚姩甯哥敤鐨勫懡浠inux璋冨害鍣
    绛旓細Linux鍐呭瓨绠$悊鏀寔铏氭嫙鍐呭瓨,鑰屽浣欏嚭鐨勮繖閮ㄥ垎鍐呭瓨灏辨槸閫氳繃纾佺洏鐢宠寰楀埌鐨,骞虫椂绯荤粺鍙妸褰撳墠杩愯鐨勭▼搴忓潡淇濈暀鍦ㄥ唴瀛樹腑,鍏朵粬绋嬪簭鍧楀垯淇濈暀鍦ㄧ鐩樹腑銆傚湪鍐呭瓨绱х己鏃,鍐呭瓨绠$悊璐熻矗鍦ㄧ鐩樺拰鍐呭瓨闂翠氦鎹㈢▼搴忓潡銆 2銆杩涚▼绠$悊杩涚▼绠$悊涓昏鎺у埗绯荤粺杩涚▼瀵笴PU鐨勮闂傚綋闇瑕佹煇涓繘绋嬭繍琛屾椂,鐢辫繘绋嬭皟搴﹀櫒鏍规嵁鍩轰簬浼樺厛绾х殑璋冨害绠楁硶鍚姩...
  • pid鍙锋槸浠涔堟剰鎬?
    绛旓細PID鍙峰彲浠ョ敤鏉ユ煡鎵俱佹殏鍋溿佺户缁繍琛屾垨缁堟杩涚▼銆傚湪绯荤粺灞傞潰涓婏紝PID鍙峰彲浠ョ敤浜庢搷浣滅郴缁熻皟搴﹀拰鍒嗛厤璧勬簮銆傚湪寮鍙戝簲鐢ㄧ▼搴忔椂锛孭ID鍙蜂篃鍙互鐢ㄤ簬绠$悊鍜岀洃鎺х▼搴忚繍琛岀姸鍐点傚湪Linux绯荤粺涓锛屽彲浠ヤ娇鐢ㄥ懡浠よ宸ュ叿ps鎴栬卼op鏉ユ煡鐪嬪悇涓繘绋嬬殑PID鍙凤紝涔熷彲浠ュ湪缂栧啓搴旂敤绋嬪簭鏃堕氳繃绯荤粺璋冪敤鑾峰彇褰撳墠杩涚▼鐨凱ID鍙枫傚湪Windows绯荤粺涓紝...
  • 濡備綍缁撴潫鐢佃剳杩涚▼?
    绛旓細缁撴潫鐢佃剳杩涚▼姣旇緝甯哥敤涓旂畝鍗曠殑鍔炴硶鏄湪浠诲姟绠$悊鍣ㄤ腑缁撴潫锛屽叿浣撶殑鏂规硶鏄紝鎸変笅閿洏涓婄殑蹇嵎閿淐trl+Alt+Delete鈥濓紝鎵撳紑浠诲姟绠$悊鍣紱鐒跺悗锛岄変腑闇瑕佺粨鏉鐨勮繘绋锛岀偣鍑汇愮粨鏉熶换鍔°戙
  • linux鐨鍐呮牳缁撴瀯鏄粈涔堟牱鐨刲inux鐨勫唴鏍哥粨鏋
    绛旓細4.linux搴旂敤 鏍囧噯鐨Linux绯荤粺涓鑸兘鏈変竴濂楅兘鏈夌О涓哄簲鐢ㄧ▼搴忕殑绋嬪簭闆嗭紝瀹冨寘鎷枃鏈紪杈戝櫒銆佺紪绋嬭瑷銆乆Window銆佸姙鍏浠躲両nternet宸ュ叿鍜屾暟鎹簱绛夈侺inux绯荤粺鍐呮牳绌洪棿涓昏鐢憋紵linux绯荤粺鍐呮牳绌洪棿涓昏鐢5涓儴鍒嗙粍鎴:鍒嗗埆鏄唴瀛樼鐞嗭紝杩涚▼绠$悊锛岃繘绋嬮棿閫氫俊锛岃櫄鎷熸枃浠剁郴缁熷拰缃戠粶鎺ュ彛銆俵inux鏂囦欢绯荤粺鏋舵瀯鐨勫洓涓粍鎴愰儴鍒...
  • Linux杩涚▼绠$悊鍙婁綔涓氭帶鍒剁殑鍚姩杩涚▼
    绛旓細閿叆闇瑕佽繍琛岀殑绋嬪簭鐨勭▼搴忓悕,鎵ц涓涓▼搴,鍏跺疄涔熷氨鏄惎鍔ㄤ簡涓涓杩涚▼銆傚湪Linux绯荤粺涓姣忎釜杩涚▼閮藉叿鏈変竴涓繘绋嬪彿,鐢ㄤ簬绯荤粺璇嗗埆鍜岃皟搴﹁繘绋嬨傚惎鍔ㄤ竴涓繘绋嬫湁涓や釜涓昏閫斿緞:鎵嬪伐鍚姩鍜岃皟搴﹀惎鍔,鍚庤呮槸浜嬪厛杩涜璁剧疆,鏍规嵁鐢ㄦ埛瑕佹眰鑷鍚姩銆 鐢辩敤鎴疯緭鍏ュ懡浠,鐩存帴鍚姩涓涓繘绋嬩究鏄墜宸ュ惎鍔ㄨ繘绋嬨備絾鎵嬪伐鍚姩杩涚▼鍙堝彲浠ュ垎涓哄緢澶氱...
  • 濡備綍鍦Linux涓鏌ョ湅鎵鏈夋鍦ㄨ繍琛鐨勮繘绋
    绛旓細ps鍛戒护鐢ㄤ簬鏌ョ湅绯荤粺涓殑杩涚▼鐘舵侊紝鏍煎紡涓猴細鈥減s [鍙傛暟]鈥濓紝甯歌鐨刾s鍛戒护鍙傛暟鍖呮嫭鏈夛細-a 鏄剧ず鎵鏈夌殑杩涚▼锛堝寘鎷叾浠栫敤鎴风殑锛-u 鐢ㄦ埛浠ュ強鍏朵粬璇︾粏淇℃伅 -x 鏄剧ず娌℃湁鎺у埗缁堢鐨勮繘绋 Linux绯荤粺涓鏃跺埢杩愯鐫璁歌澶氬鐨勮繘绋嬶紝濡傛灉鑳藉鍚堢悊鐨绠$悊瀹冧滑锛岀粷瀵规湁鐩婁簬瀵圭郴缁熺殑鎬ц兘浼樺寲锛孡inux绯荤粺涓繘绋嬫渶甯...
  • linux甯哥敤鍛戒护
    绛旓細Linux甯哥敤鍩烘湰鍛戒护涓昏鍖呮嫭鐩綍鎿嶄綔鍛戒护銆佹枃浠舵搷浣滃懡浠ゃ佹枃浠舵煡鐪嬪懡浠ゃ佺鐩樼鐞嗗懡浠ゃ佺敤鎴风鐞嗗懡浠ゃ绯荤粺绠$悊鍛戒护绛夈傜洰褰曟搷浣滃懡浠わ細cd銆乴s銆乵kdir銆乸wd銆乺mdir銆傛枃浠舵搷浣滃懡浠わ細cp銆乵v銆乼ouch銆乺m銆乬rep銆乫ind銆乧hmod銆乧hown銆乧hgrp銆乼ar銆乻plit銆乬zip銆乼ee銆乼ouch銆乽nzip銆亃ip銆乽nrar銆乻cp銆傛枃浠舵煡鐪嬪懡浠わ細cat...
  • Linux鎿嶄綔绯荤粺涓婂父鐢ㄧ殑绯荤粺绠$悊鍛戒护
    绛旓細杩涚▼鏄Linux绯荤粺涓涓涓潪甯搁噸瑕佺殑姒傚康銆侺inux鏄竴涓浠诲姟鐨勬搷浣滅郴缁,绯荤粺涓婄粡甯稿悓鏃惰繍琛岀潃澶氫釜杩涚▼銆傛垜浠笉鍏冲績杩欎簺杩涚▼绌剁珶鏄浣曞垎閰嶇殑,鎴栬呮槸鍐呮牳濡備綍绠$悊鍒嗛厤鏃堕棿鐗囩殑,鎵鍏冲績鐨勬槸濡備綍鍘绘帶鍒惰繖浜涜繘绋,璁╁畠浠兘澶熷緢濂藉湴涓虹敤鎴锋湇鍔° Linux鎿嶄綔绯荤粺鍖呮嫭涓夌涓嶅悓绫诲瀷鐨勮繘绋,姣忕杩涚▼閮芥湁鑷繁鐨勭壒鐐瑰拰灞炴с備氦浜掕繘绋嬫槸鐢...
  • 扩展阅读:linux查看进程占用端口 ... 十大国产linux系统 ... 正版linux系统官网 ... linux系统一般用来干嘛 ... linux进程的三种基本状态 ... 头歌linux之进程管理二 ... linux进程管理常用命令 ... linux进程sleep后如何唤醒 ... linux系统中进程的6种状态 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网