【问题标题】:Bash Script Return EmptyString when application running on systemd service当应用程序在 systemd 服务上运行时,Bash 脚本返回 EmptyString
【发布时间】:2022-09-14 12:29:13
【问题描述】:

我有应用程序 FastAPI,我直接通过以下命令运行

gunicorn app.main:app --workers 4 --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.0

它工作正常。现在我通过 systemd 服务为这个应用程序提供服务

[Unit]
Description=To run FX FastAPI backend through gunicorn
After=network.target

[Service]
User=root
Group=root
WorkingDirectory=/home/fx/fx_demo_all_modules/fastapi/
Environment="PATH=/home/fx/fx_demo_all_modules/fastapi/venv/bin"
ExecStart=/home/fx/fx_demo_all_modules/fastapi/venv/bin/gunicorn app.main:app --workers 4 --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.0


[Install]
WantedBy=multi-user.target

服务文件的位置是/etc/systemd/system,并且我将所有者从 root 更改为 fx

服务也很好。

当我从 python 运行 bash 脚本时出现问题

manufacturer = subprocess.check_output(['/var/www/get-manufacturer.sh'])

脚本如下

#! /bin/bash
var=$(sudo dmidecode -s system-manufacturer)
echo $var

如果我直接运行应用程序,那么如果我从服务中运行它就可以正常工作,但它不起作用。以下是 journalctl 日志

/var/www/get-manufacturer.sh: line 2: sudo: command not found

提前感谢您的解决方案。

【问题讨论】:

  • 尝试将sudo 更改为/usr/bin/sudodmidecode 更改为/usr/sbin/dmidecode
  • 尝试 sudo /usr/bin/sudo 的完整路径(运行 which sudo 并返回该输出以检查是否是问题所在)。

标签: python bash ubuntu service systemd


【解决方案1】:

将行 Environment="PATH=/home/fx/fx_demo_all_modules/fastapi/venv/bin" 更改为以下: Environment="PATH=/home/fx/fx_demo_all_modules/fastapi/venv/bin:/sbin:/bin:/usr/sbin:/usr/bin"

【讨论】:

  • 同样对于基于 gunicorn 的应用程序,最好添加您自己的 gunicorn 环境详细信息,如下所示:EnvironmentFile=/etc/my-app/conf-gunicorn.py conf-gunicorn.py 可能如下所示: # 处理请求的工作进程数 workers = 8 # 绑定的套接字绑定= "localhost:<port>" # 将访问和错误信息写入 /var/log accesslog = errorlog = "/var/log/my-app/gunicorn.log" capture_output = True
猜你喜欢
  • 1970-01-01
  • 2017-08-17
  • 1970-01-01
  • 2019-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-18
相关资源
最近更新 更多