问题描述
使用场景
在使用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权限以便执行命令,同时不用输入密码
- 在/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
- 创建ubuntu新用户
adduser apache
...# 一堆设置,默认就会
passwd apache
...# 定义用户密码
- 更改文件权限
chmod -v u+w /etc/sudoers
- 打开sudoers文件并添加内容
vim /etc/sudoers
# 找到Allow root to run any commands 类似定义的部分
root ALL=(ALL) ALL
# 在下面添加一行
apache ALL=(ALL) NOPASSWD:ALL
- 恢复文件权限
chmod -v u-w /etc/sudoers
- 在源代码的cmd部分加上
sudo
结束,执行成功