ubuntu 16.04 service 基础要点

 

原文:https://my.oschina.net/janpoem/blog/802708

 

16.04转用了systemd来对系统服务提供管理和控制(貌似15.04就已经转用了)。

添加一个服务(service)

添加一个服务,需要创建一个服务的定义文件放在 /lib/systemd/system 目录下,这里以 nginx.service 为例:

[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

创建了这个文件后,还无法直接使用。

service nginx start
systemctl start nginx
systemctl start nginx.service 

执行上述的命令后,会提示以下的错误:

Job for nginx.service failed because the control process exited with error code. See "systemctl status nginx.service" and "journalctl -xe" for details.

这时候你需要重载systemd的配置列表:

systemctl daemon-reload

你可以执行以下命令,来确认你的服务是否已经加入到配置列表:

# 这个是列举所有已经存在配置文件对应的服务状态列表
systemctl list-unit-files | grep nginx
# 列举出具有加载状态的服务列表(或者理解为最近被使用的服务)
systemctl --all | grep nginx

服务操作

如果习惯了使用 service 指令,可以继续使用:

service nginx start
service nginx stop
service nginx reload
service nginx restart
service nginx status

和过去不同,现在不再需要在 /etc/init.d 目录下添加一个服务脚本了。

但实际上Ubuntu的Wiki上推荐改用:

systemctl start nginx
systemctl start nginx.service
systemctl stop nginx
systemctl reload nginx
systemctl restart nginx
systemctl status nginx

不过 systemctl (包括 service )执行以后,是没有任何特别提示,除非碰到了错误信息,否则都是静默的,也许这是为了配合 bash 脚本的设计需求。

激活/禁用系统自启动服务

再次,要将一个服务激活为系统启动时的自启动服务,现在只要执行以下命令:

systemctl enable nginx.service
systemctl enable nginx

这样就正式激活了服务系统启动时的自启动。要禁用自启动,只要disable即可。

systemctl disable nginx.service
systemctl disable nginx

你可以执行以下的命令,来检查服务是否已经激活了自启动

systemctl is-enabled nginx
# enabled/disabled

检查一个服务是否启动:

systemctl is-active nginx
# active/inactive

关于 /etc/init 目录

这个目录,其实未必真的需要添加进一个相关的控制进程启动的配置文件,这里添加的文件,和具体的服务启动没有具体的关联性,新版本的 service 配置文件,实际上已经明确了启动服务所需的必要服务和之后加载的服务。

/etc/init 目录下存放的,可以理解为一个综合性启动的脚本配置,他支持在配置文件中,使用bash代码块,比如:

# nginx

description "nginx http daemon"
author "George Shammas <[email protected]>"

start on (filesystem and net-device-up IFACE!=lo)
stop on runlevel [!2345]

env DAEMON=/usr/sbin/nginx
env PID=/var/run/nginx.pid

expect fork
respawn
respawn limit 10 5
#oom never

pre-start script
        $DAEMON -t
        if [ $? -ne 0 ]
                then exit $?
        fi
end script

exec $DAEMON

可以理解为,对过去的启动脚本更简化版的一个启动配置文件,使用这个配置文件控制启动,还是使用 systemd 自行控制服务作为自启动,这个交给使用者去权衡吧。

这篇文章算是对这两天的知识点的一个总结吧。

添加删除windows的系统服务

原文:http://yahoon.blog.51cto.com/13184/235573

一、删除服务
办法一: 用sc.exe这个Windows命令
开始——运行——cmd.exe,然后输入sc就可以看到了。使用办法很简单:
sc delete “服务名” (如果服务名中间有空格,就需要前后加引号),服务名称可以在服务的属性里找到,不要将服务名称误认为显示名称。
如针对上面的: sc delete KSD2Service
方法二:直接进行注册表编辑
打开注册表编辑器,找到下面的键值:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services 一般服务会以相同的名字在这里显示一个主健,直接删除相关的键值便可。
方法三、特殊情况
1、如果服务显示的是rundll32.exe,并且这个文件是位于system32目录下,那么就不能删除这个rundll32.exe文件,它是Windows系统的文件。这时只要清除相关的服务就可以了
2、如果一个服务删除了马上又自动建立了,说明后台有进程在监视、保护。需要先在进程管理器中杀掉相应的进程,或者启动后按F8,到安全模式下删除。

二、添加服务
  在Windows XP系统的“服务”窗口中并不能添加或删除服务,常用的方法有以下几种:
  方法1:修改注册表
  在“开始→运行”中键入“regedit.exe”,打开“注册表编辑器”,展开分支“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services”,在右侧窗格中显示的就是本机安装的服务项。
  如果要新建服务,只须点击“编辑→新建→项”,然后为此项命名,如“test”;然后右击该项,选择“新建→字符串值”或“新建→DWORD值”即可。添加一个服务项目具体需要添加的键值如下:
  “DisplayName”,字符串值,对应服务名称;
  “Descrīption”,字符串值,对应服务描述;
  “ImagePath”,字符串值,对应该服务程序所在的路径;
  “ObjectName”,字符串值,值为“LocalSystem”,表示本地登录;
  “ErrorControl”,DWORD值,值为“1”;
  “Start”,DWORD值,值为2表示自动运行,值为3表示手动运行,值为4表示禁止;
  “Type”,DWORD值,应用程序对应10,其他对应20。
  另外,还要在“test”项下新建一个“Enum”项。按照以上步骤添加QQ程序为服务,重新启动计算机后,打开“服务”窗口,就可以看到刚才添加的QQ服务(图2)
 如果要删除某项服务,只要删除注册表的中相关键值即可,本例中要删除QQ服务,直接删除“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\test”分支即可。

参http://hi.baidu.com/zwfec/blog/item/61836406c2851e71020881c2.html