1. xxxx.service分为三部分[Unit]、[Service]和[Install]
  2. 三部分具体内容如下
  3. xxx.service存放在 /usr/lib/systemd/

[Service]

  • WorkingDirectory=/sbin/aio/duplicate_file_pool(这个路径就是下面ExecStart的路径)
  • ExecStart=/root/.pyenv/shims/python3.4 qc_server.py
  • PIDFile=xxxx(为存放PID的文件路径)
  • Environment=“GOPATH=/usr/local/go”(环境变量设置,可以设置多个)
  • User=users(设置服务运行的用户),
  • PrivateTmp=True # 是否分配独立的临时空间(缺省)
  • DefaultTimeoutStartSec=30 # 服务启动允许的最大时长,超时时间(默认无单位:秒)
  • Type=forking # 服务启动的类型
  • Type=simple(默认值):systemd认为该服务将立即启动,服务进程不会fork。如果该服务要启动其他服务,不要使用此类型启动,除非该服务是socket激活型
  • Type=forking:systemd认为当该服务进程fork,且父进程退出后服务启动成功。对于常规的守护进程(daemon),除非你确定此启动方式无法满足需求, 使用此类型启动即可。使用此启动类型应同时指定PIDFile=,以便systemd能够跟踪服务的主进程。
  • Type=oneshot:这一选项适用于只执行一项任务、随后立即退出的服务。可能需要同时设置 RemainAfterExit=yes 使得 systemd 在服务进程退出之后仍然认为服务处于激活状态。
  • Type=notify:与 Type=simple 相同,但约定服务会在就绪后向 systemd 发送一个信号,这一通知的实现由 libsystemd-daemon.so 提供
  • Type=dbus:若以此方式启动,当指定的 BusName 出现在DBus系统总线上时,systemd认为服务就绪。
  • Group=users是设置服务运行的用户组

[Unit]

Unit一般是第一部分,用来描述unit文件元数据以及服务的依赖关系。常用的命令有:

  • Description=:这里一般写服务简短的描述。 Documentation=:这里一般是服务文档的链接等。
  • Requires=:这里写本服务依赖的其他服务,启动本服务时,一般会并行的启动该服务和它所依赖的服务,如果它依赖的服务启动失败了,本服务将无法启动成功。
  • Wants=:这个命令和Requires=类似但是相对宽松一些,即使依赖的服务启动失败了,本服务也可以继续正常启动。一般的依赖都推荐使用这个命令。
  • BindsTo=:和Requires=类似,但是如果依赖的服务停止了,本服务也会停止。
  • Before=和After=:这两个需要和上面描述依赖关系的命令一起使用,表示依赖的当前服务与依赖的服务启动的先后顺序:Before=表示当前服务启动成功后才可以启动依赖服务,After=相反。
  • Conflicts=:这个命令后面跟的服务将不能和当前服务同时运行,如果当前服务运行则会导致该命令列举的服务被停止。
  • Condition…=:这个命令往往和许多其他命令一起使用,用来测试一些条件,比如测试当前的操作系统。如果条件不满足,则跳过当前服务的启动。
  • Assert…=:和Condition…=类似,但是如果条件检测不满足会导致失败。
  • Restart=always
  • NotifyAccess=all
  • KillSignal=SIGINT

[Install]

WantedBy=multi-user.target

  1. multi-user.target表明当系统以多用户方式(默认的运行级别)启动时,这个服务需要被自动运行。
  2. 例如
[Unit]
Description=DuplicateFilePool.service
After=network.target

[Service]
Type=simple
WorkingDirectory=/test/project/test_pool(WorkingDirectory=[WorkingDirectory]是什么意思?)
ExecStart=/root/python3.4 qc_server.py
Restart=always
KillSignal=SIGINT

[Install]
WantedBy=multi-user.target

server常见操作

# 自启动
systemctl enable nginx.service
# 禁止自启动
systemctl disable nginx.service
# 启动服务
systemctl start nginx.service
# 停止服务
systemctl stop nginx.service
# 重启服务
systemctl restart nginx.service

# 查看Unit定义文件
systemctl cat nginx.service
# 编辑Unit定义文件
systemctl edit nginx.service
# 重新加载Unit定义文件
systemctl reload nginx.service

# 列出已启动的所有unit,就是已经被加载到内存中
systemctl list-units
# 列出系统已经安装的所有unit,包括那些没有被加载到内存中的unit
systemctl list-unit-files

# 查看服务的日志
journalctl -u nginx.service    # 还可以配合`-b`一起使用,只查看自本次系统启动以来的日志

# 查看所有target下的unit
systemctl list-unit-files --type=target

# 查看默认target,即默认的运行级别。对应于旧的`runlevel`命令
systemctl get-default

# 设置默认的target
systemctl set-default multi-user.target

# 查看某一target下的unit
systemctl list-dependencies multi-user.target

# 切换target,不属于新target的unit都会被停止
systemctl isolate multi-user.target

systemctl poweroff    # 关机
systemctl reboot       # 重启
systemctl rescue    # 进入rescue模式