目录
- 起因
- systemd守护进程
- 单元(Units)
3.1. 单元加载路径(Unit load path)
3.2. 通用节(section)
3.2.1. [Unit]
3.2.2. [Install] - Service配置选项
- Timer配置选项
- systemctl命令
6.1. 与查看Unit状态相关
6.2. 与操作Unit相关
6.3. 与守护进程相关 - systemd如何启动服务
- References
- Materials
1. 起因
由于众所周知的原因,谷歌搜索引擎正常情况下无法使用,某度又实在令人气愤,因此,从16年开始,我就一直使用微软的必应(Bing)搜索引擎。必应有个特色就是它的主界面是自带背景图的(如图1),而且每天一换。
个人感觉每天选取的图片都还挺不错的,清晰度也很高,因此萌生了一个将它背景图片下载下来的想法。整好周末闲来无事,说干就干。
这其实就是一个再简单不过的爬虫,不需要任何复杂的欺骗手段,唯一需要做的就是查看浏览器是怎么将背景图下载下来的,然后模仿一下浏览器就行。由于一开始使用谷歌浏览器的开发者功能无法直接定位背景图元素位置,还走了点小弯路:查看源码的时候发现有一大串base64
编码的字符,我以为这就是背景图的编码,用正则表达式提取后解码发现就只是一些简单的图标而已。
下载背景图片的核心代码非常简单(GitHub Base:https://github.com/zmychou/bing-bg-downloader
),也就二十来行,也不需要除标准库外的任何三方库,主要问题是如何运行。因为背景图片每天更新,因此我们的小爬虫只需要每天爬取一次。有三种方案:
- 每天手动执行一次。主要问题是麻烦,每天还要定个闹钟;
- 程序启动后,爬取一次后休眠,定时醒来检查是否已经是第二天。缺点是当机器重启后需要重新手动启动爬虫,并且,一直占用着系统的资源,虽然是个小爬虫,但是这种占着茅坑不拉shi的做法并不可取,除非走投无路;
- 使用系统的定时任务功能。缺点是需要适配不同的系统,但是自己日常只用乌班图,简单点只关注Linux下的定时任务系统即可。
敲定了,就是Linux下的定时任务来实现我们每天爬取一张背景图的需求。
2. systemd守护进程
Linux系统中有一个叫做systemd的守护进程(Linux中一般以d
结尾的程序都是守护进程),他是系统和服务的管理者(也可以说是守护者),它可以说是Linux系统的中流砥柱,很多系统功能的实现都是以它为基础。例如主机名、日期、本地化等的配置文件的管理;已登陆用户、容器、虚拟机、简单网络处理的守护进程、域名解析、网络时间同步和日志转发等功能的维护,等等。
而定时任务是systemd提供的功能之一。想要在Linux下实现定时任务,需要三个伙计的帮忙:
systemctl
:他是查看systemd状态和控制systemd行为的主要命令;.service
单元(Unit):告诉systemd做什么;.timer
单元:告诉systemd什么时候做。
其中.service
和.timer
称为单元(Unit),其他类型的还有.device
、socket
和.mount
等,都是通过一个INI格式的配置文件来实现的,这写配置文件分别以后缀.service
和.timer
等结尾,都称为单元文件(Unit files),并且这些单元文件有固定的目录来存放,用于实现不同的服务。
因此,开启一个定时服务的操作可以分为以下四步:
- 编写
.service
单元文件; - 编写
.timer
单元文件; - 将前两步编写好的单元文件放到指定目录;
- 使用
systemctl
来使单元文件生效。
在我们的爬虫例子中,我们为定时任务编写的.service
和.timer
单元文件如下所示:
# downloader.service
[Unit]
Description= Bing background image downloader
[Service]
Type= simple
WorkingDirectory=/home/zhou/workspace/bing-bg-downloader
ExecStart=/usr/bin/python3 /home/zhou/workspace/bing-bg-downloader/downloader.py
# downloader.timer
[Unit]
Description= Bing background image downloader
[Timer]
Unit= downloader.service
OnCalendar=*-*-* 15:00:07
Persistent=true
[Install]
WantedBy=basic.target
然后,我们将它们放置在$HOME/.config/systemd/user/
目录下: