【解决】Apache2+Django处理http请求时python调用shell不执行问题

问题描述

使用场景

在使用Ubuntu18.04+Apache2+Django2.1.7+Python3.6.9处理http提交的请求时,定义的函数需要调用起服务器的shell,以便进行openSMILE提取特征,若正常则会生成一个csv文件。

问题出现

执行函数status = os.system(cmd)时,打印出status=32512,并且没有生成对应的csv文件。

原因分析

查询得知,status=32512对应os的code为127,表示未定义的操作。

  • 首先,openSMILE安装在/home下,项目在/home/WebServer下,单独运行某一个py文件时正常执行
  • 其次,考虑文件权限问题,改变home及其所含文件权限为777之后并未解决问题,但能肯定是权限问题导致

解决办法

思路:给apache单独添加一个用户,让它具有sudo权限以便执行命令,同时不用输入密码

  1. 在/etc/apache2/apache2.conf中,找到
# These need to be set in /etc/apache2/envvars
User ${
     xxxx}
Group ${
     xxxx}

并更改为

# These need to be set in /etc/apache2/envvars
User apache
Group apache
  1. 创建ubuntu新用户
adduser apache
...# 一堆设置,默认就会
passwd apache
...# 定义用户密码
  1. 更改文件权限
chmod -v u+w /etc/sudoers
  1. 打开sudoers文件并添加内容
vim /etc/sudoers
# 找到Allow root to run any commands 类似定义的部分
root	ALL=(ALL)	ALL
# 在下面添加一行
apache	ALL=(ALL)	NOPASSWD:ALL
  1. 恢复文件权限
chmod -v u-w /etc/sudoers
  1. 在源代码的cmd部分加上sudo

结束,执行成功

你可能感兴趣的:(服务器配置,解决,ubuntu,apache,python,cmd)