我有一个django应用程序,我使用gunicorn来运行它。我开始使用gunicorn的脚本看起来像这样:
django_path=/path/to/your/manage.py
settingsfile=my_name
workers=2
cd $django_path
exec gunicorn --env DJANGO_SETTINGS_MODULE=app.$settingsfile app.wsgi --workers=$workers &
这在我执行它时起作用。但是,当我在我的项目文件夹(cd /path/to/your/manage.py && ll)
中查看我的数据库时,我得到了这个:
-rw-r--r-- 1 root root 55K Dec 2 13:33 db.sqlite3
这意味着我需要root权限来对数据库进行任何操作(例如执行createuser
)。所以我浏览了Stackoverflow并试了几件事:
/etc/init.d/rc.local
gunicorn_script.sh
放入/etc/init.d
,做了/usr/sbin/update-rc.d -f gunicorn_script.sh defaults
rc.local
文件的顶部:su debian -c '/etc/init.d/gunicorn_script.sh start'
以执行gunicorn_script作为debian用户所有这些都启动了我的应用程序,但数据库的问题仍然存在(只有root权限)。
那么如何以非root用户身份运行该脚本?
答案 0 :(得分:2)
我的项目文件夹中有一个脚本,用于运行gunicorn。这是一个标题:
#!/bin/bash
CUR_DIR=$(dirname $(readlink -f $0))
WORK_DIR=$CUR_DIR
USER=myusername
PYTHON=/usr/bin/python3
GUNICORN=/usr/local/bin/gunicorn
sudo -u $USER sh -c "cd $WORK_DIR; $PYTHON -W ignore $GUNICORN -c $WORK_DIR/config/gunicorn/gunicorn.conf.py --chdir $WORK_DIR myappname.wsgi:application
<强>更新强>:
将以下代码放入文件/etc/init.d/myservice
,设置root
所有者,并为所有者授予+x
权限。
#!/bin/bash
#chkconfig: 345 95 50
#description: Starts myservice
if [ -z "$1" ]; then
echo "`basename $0` {start|stop}"
exit
fi
case "$1" in
start)
sh /path/to/run_script.sh start &
;;
stop)
sh /path/to/run_script.sh stop
;;
esac
现在您可以使用sudo service myservice start
对不起,我对systemd
还不熟悉,但有了它可能会更容易。
答案 1 :(得分:1)
好的,所以我发现db.sqlite3
将通过我从root运行的makemigrations
和migrate
命令在django中创建。
因此,权限问题。我转向debian并从那里运行命令等瞧:
-rw-r--r-- 1 debian debian 55K Dec 2 13:33 db.sqlite3