在Linux上部署程序
2019-12-29 本文已影响0人
土豆吞噬者
nohup &
程序在Linux上运行时,如果关闭session,程序会因为收到SIGHUP信号结束,使用nohup可以免疫该信号。如果使用Ctrl+C,程序会因为收到SIGINT信号结束,使用&可以免疫该信号。
nohup和&常常一起使用,这个时候会同时免疫SIGHUP和SIGINT信号:
nohup command &
systemd
systemd是Linux系统的第一个进程,使用systemd可以创建服务来运行程序,systemctl是systemd的主命令,可以用来管理服务,下面是常见的systemctl命令:
# 启动服务
systemctl start servicename
# 停止服务
systemctl stop servicename
# 重启服务
systemctl restart servicename
# 杀死一个服务的所有子进程
systemctl kill servicename
# 重新加载一个服务的配置文件
systemctl reload servicename
# 开机启动该服务
systemctl enable servicename
# 开机不启动该服务
systemctl disable servicename
# 查看服务当前状态
systemctl status servicename
service配置文件存在以下三个文件夹中,优先级依此降低:
- /etc/systemd/system
- /run/systemd/system
- /usr/lib/systemd/system或/lib/systemd/system
service配置文件通常由3段组成,分别是[Unit],[Unit的类型:Service等],[Install]。
[Unit]常见参数:
- Description:描述信息。
- After:表明在哪个Unit后面启动。
- Before:表明在哪个Unit前面启动。
- Requires:强依赖的Unit,如果这些Unit没启动,那么该Unit也不会启动。
- Wants:弱依赖的Unit,启动该Unit后最好还启动哪些Unit。
- Conflicts:与哪些Unit冲突,如果这些Unit启动了,那么该Unit不启动。
[Service]常见参数:
- ExecStart:启动服务执行的命令。
- ExecStop:停止服务执行的命令。
- ExecReload:重新加载服务执行的命令。
- ExecStartPre:启动服务之前执行的命令。
- ExecStartPost字段:启动服务之后执行的命令。
- ExecStopPost字段:停止服务之后执行的命令。
- RestartSec:表示 Systemd 重启服务之前,需要等待的秒数,默认是100毫秒。
- RemainAfterExit:如果设定为yes,表示进程退出以后,服务仍然保持执行。
- Type:启动类型,它可以设置为下面的值:
- simple(默认值):ExecStart字段启动的进程为主进程。
- forking:ExecStart字段将以fork()方式启动,此时父进程将会退出,子进程将成为主进程。
- oneshot:类似于simple,但只执行一次,Systemd 会等它执行完,才启动其他服务。
- dbus:类似于simple,但会等待 D-Bus 信号后启动。
- notify:类似于simple,启动结束后会发出通知信号,然后 Systemd 再启动其他服务。
- idle:类似于simple,但是要等到其他任务都执行完,才会启动该服务。一种使用场合是为让该服务的输出,不与其他服务的输出相混合。
- Restart:定义了服务退出后的重启方式,它可以设置为下面的值:
- no(默认值):退出后不会重启。
- on-success:只有正常退出时(退出状态码为0),才会重启。
- on-failure:非正常退出时(退出状态码非0),包括被信号终止和超时,才会重启。
- on-abnormal:只有被信号终止和超时,才会重启。
- on-abort:只有在收到没有捕捉到的信号终止时,才会重启。
- on-watchdog:超时退出,才会重启。
- always:不管是什么退出原因,总是重启。
- KillMode:定义了systemd如何停止服务,它可以设置为下面的值:
- control-group(默认值):当前控制组里面的所有子进程,都会被杀掉。
- process:只杀主进程。
- mixed:主进程将收到 SIGTERM 信号,子进程收到 SIGKILL 信号。
- none:没有进程会被杀掉,只是执行服务的 stop 命令。
[Install]常见参数:
- WantedBy:表示该服务所在的Target,Target的含义是服务组,表示一组服务,默认的启动Target为multi-user.target。
hello.service:
[Unit]
Description=hello world
[Service]
Type=simple
ExecStart=/bin/hello
[Install]
WantedBy=multi-user.target