systemctl .service 无法读取环境变量

systemctl .service 无法读取环境变量

我正在使用 django,现在尝试使用 nginx 和 uwsi 配置服务器。现在我正在运行 nginx+socket+uwsgi_emperor。为了运行 uwsgi,我在终端中使用以下命令:

 /usr/local/bin/uwsgi --emperor /etc/uwsgi/vassals --uid www-data --gid www-data

并且它运行得很好。现在我想添加服务,systemctl {start|stop|restart|status} uwsgi.service这样我就可以轻松使用 uwsgi。这里出现了问题。这里是 /etc/systemd/system/uwsgi.service:

[Unit]
Description=uWSGI Emperor
After=syslog.target

[Service]
# i'm putting code same code of terminal exactly here:
ExecStart=/usr/local/bin/uwsgi --emperor /etc/uwsgi/vassals --uid www-data --gid www-data
# Requires systemd version 211 or newer
RuntimeDirectory=uwsgi
Restart=always
KillSignal=SIGQUIT
Type=notify
StandardError=syslog
NotifyAccess=all

[Install]
WantedBy=multi-user.target

现在,当我启动它并systemctl start uwsgi.service运行它时,我可以看到systemctl status uwsgi.service它已很好地加载,但是当我想要访问 ip 时,出现错误,journalctl -b -u uwsgi显示我的 django 无法访问(读取)环境变量。因为我在 django 的设置中使用了几个环境变量,所以没有它们的值,django 就无法正常工作。为什么会这样?(当我在命令行中运行 uwsgi 时一切都很好,但是当我想在 systemctl 中使用相同的命令时,django 无法读取环境变量并发生错误)。谢谢

答案1

这表明我的 django 无法访问(读取)环境变量

因为 systemd 没有与您的用户、该用户环境和那些变量一起在 shell 中运行。

当我在命令行中运行 uwsgi 时

然后,您就可以使用自己的用户以及该环境和这些变量。


你需要一个

EnvironmentFile=/dir/to/file

在你之前ExecStart。或者如果没有那么多,你也可以做

Environment={VAR}={VALUE}

(每个变量一行)其中

  • {VAR} 是你的环境变量的名称
  • {VALUE} 是该 {VAR} 的值

答案2

除了接受的答案之外的另一种方法是将其/bin/bash -lc '<your command>'用于 ExecStart 或 ExecStop

ExecStart=/bin/bash -lc 'yarn start'

并有一个/etc/profile与环境变量对应的文件。

相关内容