这么多年来,我们一直在 ubuntu 14.04 上运行 upstart 作业,现在我们即将转向新版本的 ubuntu 16.04,但我无法在 systemD 中创建相同的作业。
description "evercam_media"
start on filesystem or runlevel [2345]
stop on runlevel [!2345]
limit nofile 1000000 1000000
respawn
chdir /
setuid root
setgid root
env HOME=/home/root
env LANG=en_US.UTF-8
env LANGUAGE=en_US:en
env LS_ALL=en_US.UTF-8
env ERL_MAX_PORTS=10240
env ERL_MAX_ETS_TABLES=5000
env PORT=4000
env MIX_ENV=prod
exec watch -n1 '/usr/local/bin/run_evercam_media.sh'
post-stop exec sudo pkill beam
虽然看到了其他人的一些工作,但我尝试了很多方法,但它并没有启动我的应用程序,任何帮助都将不胜感激,谢谢,很抱歉信息太少,我对这类东西很陌生。
更新:
[Unit]
Description=Runner for My Phoenix App
After=network.target
[Service]
WorkingDirectory=/etc/build/
EnvironmentFile=/etc/default/my_phoenix_app.env
ExecStart=/usr/local/bin/run_evercam_media.sh
ExecStop=sudp pkill beam
User=root
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
答案1
您的服务没有类型。
[Service]
该部分中应指定的基本内容之一是Type=
服务的。它按其进程和守护进程行为对服务进行分类。这很重要,因为它告诉 systemd 如何正确管理服务并找出其状态。可以
Type= directive
是下列之一:
simple
:服务的主进程在起始行中指定。如果未设置Type=
和指令,但设置了,则这是默认进程。任何通信都应通过适当类型的第二个单元在单元外部处理(例如,如果此单元必须使用套接字进行通信,则通过 .socket 单元处理)。Busname=
ExecStart=
forking
:当服务派生出子进程时使用此服务类型,几乎立即退出父进程。这告诉 systemd,即使父进程已退出,该进程仍在运行。
oneshot
:此类型表示进程将短暂存在,systemd 应等待进程退出后再继续处理其他单元。这是默认设置Type=
,ExecStart=
无需设置。它用于一次性任务。
dbus
:这表示该单元将在 D-Bus 总线上取一个名称。发生这种情况时,systemd 将继续处理下一个单元。
notify
:这表示服务启动完成后会发出通知。systemd 进程会等待此通知,然后再继续处理其他单元。
idle
:这表示直到所有作业都调度完毕后,该服务才会运行。
来自 Digital Ocean 的了解 Systemd 单元和单元文件