2018年6月

在上一篇文章中,我们展示了如何创建一个 systemd 服务并使普通用户可以启动和终止游戏服务器。但到目前为止,使用这个服务并不比直接运行服务器高明多少。让我们更进一步,让其可以向玩家发邮件,包括在服务器可用时通知玩家,在服务器关闭前警告玩家:

# minetest.service

[Unit]
Description= Minetest server
Documentation= https://wiki.minetest.net/Main_Page

[Service]
Type= simple

ExecStart= /usr/games/minetest --server
ExecStartPost= /home/<username>/bin/mtsendmail.sh "Ready to rumble?" "Minetest Starting up"

TimeoutStopSec= 180
ExecStop= /home/<username>/bin/mtsendmail.sh "Off to bed. Nightie night!" "
  Minetest Stopping in 2 minutes"
ExecStop= /bin/sleep 120
ExecStop= /bin/kill -2 $MAINPID

这里涉及几个新的指令。首先是 ExecStartPost 指令,该指令可以在主进程启动后马上执行任何你指定的操作。在本例中,你执行了一个自定义脚本 mtsendmail (内容如下),该脚本以邮件形式通知你的朋友服务器已经启动。

#!/bin/bash
# mtsendmail
echo $1 | mutt -F /home/<username>/.muttrc -s "$2" my_minetest@mailing_list.com

我们使用 Mutt 这个命令后邮件客户端发送消息。虽然从实际效果来看,上述脚本仅有 1 行,但 systemd 单元的参数中不能包含管道及重定向操作,故我们需要将其封装到脚本中。

顺便提一下,还有一个 ExecStartPre 指令,用于在服务主进程执行之前进行指定操作。

接下来我们看到,关闭服务器涉及了好几条指令。TimeoutStopSec 指令用于设置 systemd 友好关闭服务的最大等候时间,默认值大约是 90 秒。超过这个最大等候时间,systemd 会强制关闭服务并报错。考虑到你希望在彻底关闭服务器前给用户预留几分钟的时间,你需要将超时时间提高至 3 分钟,这样 systemd 就不会误认为服务关闭时出现问题。

接下来是关闭服务的具体指令部分。虽然没有 ExecStopPre 这样的指令,但你可以通过多次使用 ExecStop 指令实现关闭服务器前执行操作的目标。多个 ExecStop 指令按从上到下的顺序依次运行,这样你就可以在服务器真正关闭前向用户发送消息。

通过这个特性,你首先应该向你的朋友发邮件,警告其服务器即将关闭,然后等待两分钟,最后关闭服务器。可以使用 Ctrl + c 关闭 Minetest 服务器,该操作会被转换为一个中断信号(SIGINT);当你执行 kill -2 $MAINPID 时就会发送该中断信号,其中 $MAINPID 是 systemd 变量,用于记录你服务中主进程的 PID 信息。

看上去好多了!如果你此时启动服务:

systemctl --user start minetest

服务会启动 Minetest 服务器并向你的用户发送邮件。关闭服务的情形基本类似,只不过会额外留给用户 2 分钟时间退出登录。

开机自启动

下一步我们让你的服务在主机启动后立即可用,在主机关闭时自动关闭。

我们需要将你的服务文件移动到系统服务目录,即 /etc/systemd/system/

sudo mv /home/<username>/.config/systemd/user/minetest.service /etc/systemd/system/

如果你希望此时启动该服务,你需要拥有超级用户权限:

sudo systemctl start minetest

另外,可以使用如下命令检查服务状态:

sudo systemctl status minetest

你会发现服务很糟糕地处于失败状态,这是因为 systemd 不能通过上下文信息、特征、配置文件得知具体使用哪个用户运行该服务。在单元文件中增加 User 指令可以解决这个问题。

# minetest.service

[Unit]
Description= Minetest server
Documentation= https://wiki.minetest.net/Main_Page

[Service]
Type= simple
User= <username>

ExecStart= /usr/games/minetest --server
ExecStartPost= /home/<username>/bin/mtsendmail.sh "Ready to rumble?"
  "Minetest Starting up"

TimeoutStopSec= 180
ExecStop= /home/<username>/bin/mtsendmail.sh "Off to bed. Nightie night!"
  "Minetest Stopping in 2 minutes"
ExecStop= /bin/sleep 120
ExecStop= /bin/kill -2 $MAINPID

systemd 从 User 指令中得知应使用哪个用户的环境变量来正确运行该服务。你可以使用 root 用户,但这可能产生安全风险;使用你的个人用户会好一些,但不少管理员的做法是为服务单独创建一个用户,这样可以有效地将服务与其它用户和系统组件相互隔离。

下一步我们让你的服务在系统启动时自动启动,系统关闭时自动关闭。要达到这个目的,你需要 启用 你的服务;但在这之前,你还需要告知 systemd 从哪里 安装 它。

对于 systemd 而言,安装 意味着告知 systemd 在系统启动的具体哪个步骤激活你的服务。以通用 Unix 打印系统(cups.service)为例,它的启动在网络框架启动之后、其它打印服务启动之前。又如,minetest.server 需要使用用户邮件(及其它组件),需要等待网络和普通用户对应的服务就绪后才可启动。

你只需要在单元文件中添加一个新段和新指令:

...
[Install]
WantedBy= multi-user.target

你可以将其理解为“等待多用户系统的全部内容就绪”。systemd 中的“目标”类似于旧系统中的运行级别,可以用于将主机转移到一个或另一个状态,也可以像本例中这样让你的服务等待指定状态出现后运行。

你的最终 minetest.service 文件如下:

# minetest.service
[Unit]
Description= Minetest server
Documentation= https://wiki.minetest.net/Main_Page

[Service]
Type= simple
User= <username>

ExecStart= /usr/games/minetest --server
ExecStartPost= /home/<username>/bin/mtsendmail.sh "Ready to rumble?"
  "Minetest Starting up"

TimeoutStopSec= 180
ExecStop= /home/<username>/bin/mtsendmail.sh "Off to bed. Nightie night!"
  "Minetest Stopping in 2 minutes"
ExecStop= /bin/sleep 120
ExecStop= /bin/kill -2 $MAINPID

[Install]
WantedBy= multi-user.target

在尝试新的服务之前,你还需要对邮件脚本做一些调整:

#!/bin/bash
# mtsendmail

sleep 20
echo $1 | mutt -F /home/<username>/.muttrc -s "$2" my_minetest@mailing_list.com
sleep 10

这是因为系统需要一定的时间启动邮件系统(这里等待 20 秒),也需要一定时间完成邮件发送(这里等待 10 秒)。注意脚本中的等待时间数值适用于我的系统,你可能需要针对你的系统调整数值。

大功告成啦。执行如下操作:

sudo systemctl enable minetest

你的 Minetest 服务将在系统启动时自动启动,在系统关闭时友好关闭并通知你的用户。

总结

事实上 Debian、 Ubuntu 和一些族类的发行版提供了 minetest-server 这个特别的软件包,可以提供一部分上述功能,(但不包括邮件通知功能)。即使如此,你还是可以建立你独有的自定义服务;事实上,你目前建立的服务比 Debian 默认提供的服务更加通用,可以提供更多功能。

更进一步的说,我们这里描述的流程可以让你将大多数简单服务器转换为服务,类型可以是游戏、网站应用或其它应用。同时,这也是你名副其实地踏入 systemd 大师殿堂的第一步。


via: https://www.linux.com/blog/learn/2018/5/systemd-services-beyond-starting-and-stopping

作者:Paul Brown 选题:lujun9972 译者:pinewall 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

今天,我们要了解 Orbital AppsORBOpen Runnable Bundle)apps(开放可运行程序包),一个自由的、跨平台的开源程序集合。所有 ORB 程序都是可移动的。你可以将它们安装在你的 Linux 系统或 USB 驱动器上,以便你可以在任何系统上使用相同的程序。它们不需要 root 权限,并且没有依赖关系。所有必需的依赖关系都包含在程序中。只需将 ORB 程序复制到 USB 驱动器并将其插入到任何 Linux 系统中就立即开始使用它们。所有设置和配置以及程序的数据都将存储在 USB 驱动器上。由于不需要在本地驱动器上安装程序,我们可以在联机或脱机的计算机上运行应用程序。这意味着我们不需要 Internet 来下载任何依赖。

ORB 程序压缩了 60%,因此我们甚至可以从小型 USB 驱动器存储和使用它们。所有 ORB 应用程序都使用 PGP / RSA 进行签名,并通过 TLS 1.2 进行分发。所有应用程序打包时都不做任何修改,甚至不会重新编译。以下是当前可用的便携式 ORB 应用程序列表。

  • abiword
  • audacious
  • audacity
  • darktable
  • deluge
  • filezilla
  • firefox
  • gimp
  • gnome-mplayer
  • hexchat
  • inkscape
  • isomaster
  • kodi
  • libreoffice
  • qbittorrent
  • sound-juicer
  • thunderbird
  • tomahawk
  • uget
  • vlc
  • 未来还有更多

Orb 是开源的,所以如果你是开发人员,欢迎协作并添加更多程序。

下载并使用可移动 ORB 程序

正如我已经提到的,我们不需要安装可移动 ORB 程序。但是,ORB 团队强烈建议你使用 ORB 启动器 来获得更好的体验。 ORB 启动器是一个小的安装程序(小于 5MB),它可帮助你启动 ORB 程序,并获得更好,更流畅的体验。

让我们先安装 ORB 启动器。为此,下载 ORB 启动器。你可以手动下载 ORB 启动器的 ISO 并将其挂载到文件管理器上。或者在终端中运行以下任一命令来安装它:

$ wget -O - https://www.orbital-apps.com/orb.sh | bash

如果你没有 wget,请运行:

$ curl https://www.orbital-apps.com/orb.sh | bash

询问时输入 root 用户和密码。

就是这样。Orbit 启动器已安装并可以使用。

现在,进入 ORB 可移动程序下载页面,并下载你选择的程序。在本教程中,我会下载 Firefox。

下载完后,进入下载位置并双击 ORB 程序来启动它。点击 Yes 确认。

Firefox ORB 程序能用了!

同样,你可以立即下载并运行任何程序。

如果你不想使用 ORB 启动器,请将下载的 .orb 安装程序设置为可执行文件,然后双击它进行安装。不过,建议使用 ORB 启动器,它可让你在使用 ORB 程序时更轻松、更顺畅。

就我测试的 ORB 程序而言,它们打开即可使用。希望这篇文章有帮助。今天就是这些。祝你有美好的一天!

干杯!!


via: https://www.ostechnix.com/orbitalapps-new-generation-ubuntu-linux-applications/

作者:SK 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

在我们之前的教程中,我们讨论了如何使用 gzip 和 bzip2 压缩和解压缩文件。在本教程中,我们将学习如何在 Linux 归档文件。归档和压缩有什么不同吗?你们中的一些人可能经常认为这些术语有相同的含义。但是,这两者完全不同。归档是将多个文件和目录(相同或不同大小)组合成一个文件的过程。另一方面,压缩是减小文件或目录大小的过程。归档通常用作系统备份的一部分,或者将数据从一个系统移至另一个系统时。希望你了解归档和压缩之间的区别。现在,让我们进入主题。

归档文件和目录

归档文件和目录最常见的程序是:

  1. tar
  2. zip

这是一个很大的话题,所以,我将分两部分发表这篇文章。在第一部分中,我们将看到如何使用 tar 命令来归档文件和目录。

使用 tar 命令归档文件和目录

Tar 是一个 Unix 命令,代表 Tape Archive(磁带归档)。它用于将多个文件(相同或不同大小)组合或存储到一个文件中。在 tar 实用程序中有 4 种主要的操作模式。

  1. c – 从文件或目录中建立归档
  2. x – 提取归档
  3. r – 将文件追加到归档
  4. t – 列出归档的内容

有关完整的模式列表,参阅 man 手册页。

创建一个新的归档

为了本指南,我将使用名为 ostechnix 的文件夹,其中包含三种不同类型的文件。

$ ls ostechnix/
file.odt image.png song.mp3

现在,让我们为 ostechnix 目录创建一个新的 tar 归档。

$ tar cf ostechnix.tar ostechnix/

这里,c 标志指的是创建新的归档,f 是指定归档文件。

同样,对当前工作目录中的一组文件创建归档文件,使用以下命令:

$ tar cf archive.tar file1 file2 file 3

提取归档

要在当前目录中提取归档文件,只需执行以下操作:

$ tar xf ostechnix.tar

我们还可以使用 C 标志(大写字母 C)将归档提取到不同的目录中。例如,以下命令将归档文件提取到 Downloads 目录中。

$ tar xf ostechnix.tar -C Downloads/

或者,转到 Downloads 文件夹并像下面一样提取其中的归档。

$ cd Downloads/
$ tar xf ../ostechnix.tar

有时,你可能想要提取特定类型的文件。例如,以下命令提取 “.png” 类型的文件。

$ tar xf ostechnix.tar --wildcards "*.png"

创建 gzip 和 bzip 格式的压缩归档

默认情况下,tar 创建归档文件以 .tar 结尾。另外,tar 命令可以与压缩实用程序 gzipbzip 结合使用。文件结尾以 .tar 为扩展名使用普通 tar 来归档文件,文件以 tar.gz.tgz 结尾使用 gzip 归档并压缩文件,文件以 tar.bz2.tbz 结尾使用 bzip 归档并压缩。

首先,让我们来创建一个 gzip 归档:

$ tar czf ostechnix.tar.gz ostechnix/

或者:

$ tar czf ostechnix.tgz ostechnix/

这里,我们使用 z 标志来使用 gzip 压缩方法压缩归档文件。

你可以使用 v 标志在创建归档时查看进度。

$ tar czvf ostechnix.tar.gz ostechnix/
ostechnix/
ostechnix/file.odt
ostechnix/image.png
ostechnix/song.mp3

这里,v 指显示进度。

从一个文件列表创建 gzip 归档文件:

$ tar czf archive.tgz file1 file2 file3

要提取当前目录中的 gzip 归档文件,使用:

$ tar xzf ostechnix.tgz

要提取到其他文件夹,使用 -C 标志:

$ tar xzf ostechnix.tgz -C Downloads/

现在,让我们创建 bzip 归档。为此,请使用下面的 j 标志。

创建一个目录的归档:

$ tar cjf ostechnix.tar.bz2 ostechnix/

$ tar cjf ostechnix.tbz ostechnix/

从一个列表文件中创建归档:

$ tar cjf archive.tar.bz2 file1 file2 file3

$ tar cjf archive.tbz file1 file2 file3

为了显示进度,使用 v 标志。

现在,在当前目录下,让我们提取一个 bzip 归档。这样做:

$ tar xjf ostechnix.tar.bz2

或者,提取归档文件到其他目录:

$ tar xjf ostechnix.tar.bz2 -C Downloads

一次创建多个目录和/或文件的归档

这是 tar 命令的另一个最酷的功能。要一次创建多个目录或文件的 gzip 归档文件,使用以下文件:

$ tar czvf ostechnix.tgz Downloads/ Documents/ ostechnix/file.odt

上述命令创建 DownloadsDocuments 目录和 ostechnix 目录下的 file.odt 文件的归档,并将归档保存在当前工作目录中。

在创建归档时跳过目录和/或文件

这在备份数据时非常有用。你可以在备份中排除不重要的文件或目录,这是 –exclude 选项所能帮助的。例如你想要创建 /home 目录的归档,但不希望包括 DownloadsDocumentsPicturesMusic 这些目录。

这是我们的做法:

$ tar czvf ostechnix.tgz /home/sk --exclude=/home/sk/Downloads --exclude=/home/sk/Documents --exclude=/home/sk/Pictures --exclude=/home/sk/Music

上述命令将对我的 $HOME 目录创建一个 gzip 归档,其中不包括 DownloadsDocumentsPicturesMusic 目录。要创建 bzip 归档,将 z 替换为 j,并在上例中使用扩展名 .bz2

列出归档文件但不提取它们

要列出归档文件的内容,我们使用 t 标志。

$ tar tf ostechnix.tar
ostechnix/
ostechnix/file.odt
ostechnix/image.png
ostechnix/song.mp3

要查看详细输出,使用 v 标志。

$ tar tvf ostechnix.tar
drwxr-xr-x sk/users 0 2018-03-26 19:52 ostechnix/
-rw-r--r-- sk/users 9942 2018-03-24 13:49 ostechnix/file.odt
-rw-r--r-- sk/users 36013 2015-09-30 11:52 ostechnix/image.png
-rw-r--r-- sk/users 112383 2018-02-22 14:35 ostechnix/song.mp3

追加文件到归档

文件或目录可以使用 r 标志添加/更新到现有的归档。看看下面的命令:

$ tar rf ostechnix.tar ostechnix/ sk/ example.txt

上面的命令会将名为 sk 的目录和名为 exmple.txt 添加到 ostechnix.tar 归档文件中。

你可以使用以下命令验证文件是否已添加:

$ tar tvf ostechnix.tar
drwxr-xr-x sk/users 0 2018-03-26 19:52 ostechnix/
-rw-r--r-- sk/users 9942 2018-03-24 13:49 ostechnix/file.odt
-rw-r--r-- sk/users 36013 2015-09-30 11:52 ostechnix/image.png
-rw-r--r-- sk/users 112383 2018-02-22 14:35 ostechnix/song.mp3
drwxr-xr-x sk/users 0 2018-03-26 19:52 sk/
-rw-r--r-- sk/users 0 2018-03-26 19:39 sk/linux.txt
-rw-r--r-- sk/users 0 2018-03-26 19:56 example.txt

TL;DR

创建 tar 归档:

  • 普通 tar 归档: tar -cf archive.tar file1 file2 file3
  • Gzip tar 归档: tar -czf archive.tgz file1 file2 file3
  • Bzip tar 归档: tar -cjf archive.tbz file1 file2 file3

提取 tar 归档:

  • 普通 tar 归档: tar -xf archive.tar
  • Gzip tar 归档: tar -xzf archive.tgz
  • Bzip tar 归档: tar -xjf archive.tbz

我们只介绍了 tar 命令的基本用法,这些对于开始使用 tar 命令足够了。但是,如果你想了解更多详细信息,参阅 man 手册页。

$ man tar

好吧,这就是全部了。在下一部分中,我们将看到如何使用 Zip 实用程序来归档文件和目录。

干杯!


via: https://www.ostechnix.com/how-to-archive-files-and-directories-in-linux-part-1/

作者:SK 选题:lujun9972 译者:MjSeven 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

让我们假设你希望搭建一个游戏服务器,运行 Minetest 这款非常酷、开源的,以采集 & 合成为主题的沙盒游戏。你希望将游戏运行在位于客厅的服务器中,以便搭建完成后可供你的学校或朋友使用。你知道内核邮件列表的管理就不过就是如此,那么对你来说也是足够的。

但你很快发现每次开机之后需要启动服务进程,每次关机之前需要安全地关闭服务器,十分繁琐和麻烦。

最初,你可能用守护进程的方式运行服务器:

minetest --server &

记住进程 PID 以便后续使用。

接着,你还需要通过邮件或短信的方式将服务器已经启动的信息告知你的朋友。然后你就可以开始游戏了。

转眼之间,已经凌晨三点,今天的战斗即将告一段落。但在你关闭主机、睡个好觉之前,还需要做一些操作。首先,你需要通知其它玩家服务器即将关闭,找到记录我们之前提到的 PID 的纸条,然后友好地关闭 Minetest 服务进程。

kill -2 <PID>

这是因为直接关闭主机电源很可能导致文件损坏。下一步也是最后一步,关闭主机电源。

一定有方法能让事情变得更简单。

让 Systemd 服务拯救你

让我们从构建一个普通用户可以(手动)运行的 systemd 服务开始,然后再逐步增加内容。

不需要管理员权限即可运行的服务位于 ~/.config/systemd/user/,故首先需要创建这个目录:

cd
mkdir -p ~/.config/systemd/user/

有很多类型的 systemd 单元 (曾经叫做 systemd 脚本),包括“计时器”和“路径”等,但我们这里关注的是“服务”类型。在 ~/.config/systemd/user/ 目录中创建 minetest.service 文件,使用文本编辑器打开并输入如下内容:

# minetest.service

[Unit]
Description= Minetest server
Documentation= https://wiki.minetest.net/Main_Page

[Service]
Type= simple
ExecStart= /usr/games/minetest --server

可以看到该单元中包含不同的段,其中 [Unit] 段主要为用户提供信息,给出该单元的描述及如何获得更多相关文档。

脚本核心位于 [Service] 段,首先使用 Type 指令确定服务类型。服务有多种类型,下面给出两个示例。如果你运行的进程设置环境变量、调用另外一个进程(主进程)、退出运行,那么你应该使用的服务类型为 forking。如果你希望在你的单元对应进程结束运行前阻断其他单元运行,那么你应该使用的服务类型为 oneshot

但 Minetest 服务器的情形与上面两种都不同,你希望启动服务器并使其在后台持续运行;这种情况下应该使用 simple 类型。

下面来看 ExecStart 指令,它给出 systemd 需要运行的程序。在本例中,你希望在后台运行 minetest 服务器。如上所示,你可以在可执行程序后面添加参数,但不能将一系列 Bash 命令通过管道连接起来。下面给出的例子无法工作:

ExecStart: lsmod | grep nvidia > videodrive.txt

如果你需要将 Bash 命令通过管道连接起来,可以将其封装到一个脚本中,然后运行该脚本。

还需要注意一点,systemd 要求你给出程序的完整路径。故如果你想使用 simple 类型运行类似 ls 的命令,你需要使用 ExecStart= /bin/ls

另外还有 ExecStop 指令用于定制服务终止的方式。我们会在第二部分讨论这个指令,但你要了解,如果你没有指定 ExecStop,systemd 会帮你尽可能友好地终止进程。

systemd.directives 的帮助页中包含完整指令列表,另外你可以在该网站上找到同样的列表,点击即可查看每个指令的具体信息。

虽然只有 6 行,但你的 minetest.service 已经是一个有完整功能的 systemd 单元。执行如下命令启动服务:

systemd --user start minetest

执行如下命令终止服务:

systemd --user stop minetest

选项 --user 告知 systemd 在你的本地目录中检索服务并用你的用户权限执行服务。

我们的服务器管理故事到此完成了第一部分。在第二部分,我们将在启动和终止服务的基础上,学习如何给用户发邮件、告知用户服务器的可用性。敬请期待。

可以通过 Linux 基金会和 edX 的免费课程 “Linux 入门”学习更多 Linux 知识。


via: https://www.linux.com/blog/learn/intro-to-linux/2018/5/writing-systemd-services-fun-and-profit

作者:Paul Brown 选题:lujun9972 译者:pinewall 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出