我想知道你是否可以提供帮助 .
我正在运行以下版本:
OS: SMP Debian 3.2.81-1 x86_64
uWSGI: uWSGI 2.0.11.2
我手动安装了uWSGI,因为我想使用特定版本 . 使用以下命令: -
apt-get install build-essential psmisc python-dev libxml2 libxml2-dev python-setuptools
cd /opt/
wget http://projects.unbit.it/downloads/uwsgi-2.0.11.2.tar.gz
tar -zxvf uwsgi-2.0.11.2.tar.gz
mv uwsgi-2.0.11.2/ uwsgi/
cd uwsgi/
python setup.py install
我试图在项目已经在实时环境中工作的另一台服务器上复制设置(我实际上是在设置测试服务器环境) .
原始服务器在启动时运行uWSGI . 为了弄清楚这是怎么回事,我用了
htops
我已经能够通过一组命令行开关识别uWSGI在现有服务器上运行 . 我已经设法跟踪在init.d文件夹中使用这些开关初始化uWSGI的脚本 .
我将此脚本复制到我的测试服务器,并使用它运行
service script.sh start
经过各种故障排除,主要涉及对套接字文件夹等的权限,现在当我运行此脚本时,它启动,如果我运行htop,我可以看到uWSGI正在运行,它具有我需要的完全相同的命令开关 .
我想只需将脚本放在init.d中并赋予它执行权限
chmod +x script.sh
足以让它在服务器开启时启动......但似乎并非如此 . 因为当我发行
reboot
在终端,终端重新启动但是当我进入htops并检查uWSGI进程时它没有运行 .
但是,如果直接重启后我发出以下命令
service script.sh start
服务开始很好,我可以再次在htops中看到它 .
在线研究引导我建议我应该尝试将脚本设置为使用chkconfig自动运行 . 我用chkconfig安装了
apt-get chkconfig
然后运行以下命令
chkconfig --list
我注意到我试图在启动时执行的脚本的所有运行时级别设置为off .
我运行了以下命令
chkconfig /etc/init.d/script.sh on
现在,当我使用chkconfig检查脚本运行时开关时,它会显示我脚本的以下输出:
script.sh 0:off 1:off 2:on 3:on 4:on 5:on 6:off
但是,当我重新启动时,uWSGI进程仍然无法启动 .
然而,如果我只是打字
service script.sh start
在终端,服务运行正常,uWSGI运行正常 .
如何设置脚本在服务器重新启动时运行?
编辑:
对正常工作的实时服务器的进一步研究已经确定它似乎没有使用systemd在启动时启动uWSGI . 我登录了实时服务器,但有一个
/etc/systemd
文件夹,它只有一个文件夹 system
,没有文件 . 系统文件夹中包含以下文件:
multi-user.target.wants sockets.target.wants syslog.service
所以在这里似乎没有任何uWSGI相关的内容 .
还有什么让我觉得这可能与此有关
/etc/init.d
文件夹,就是当我运行htop并检查正在运行的服务(或守护进程)时,不太确定linux中的正确术语 . uWSGI在这里显示为运行时带有命令行开关的签名,我在 /etc/init.d
中找到的脚本具有这个确切的uWSGI命令和相同的交换机签名,所以我想出了我需要做什么,把它带到除了在新服务器上将同一文件复制到 /etc/init.d
并赋予其执行权限之外 .
实时服务器的操作系统是:
SMP Debian 3.2.73-2+deb7u1 x86_64
我在新服务器上运行的操作系统是
SMP Debian 3.2.81-1 x86_64
所以他们看起来很相似?虽然我不确定版本号中最低有效数字的8个增量有多重要 .
在新服务器上没有 /etc/systemd
文件夹,在实时服务器上有一个 /etc/systemd
,如上所述 . 所以它似乎已经单独安装到主OS安装(因为我有一个更高版本的Debian,它不是't installed on my system by default) - so perhaps there is something related to systemd that is causing the script to start on the live server, but I' m不太确定 .
1 回答
杰西
在最近的Debian(Jessie)中,
initv
脚本不像他们那样工作 . 鉴于您的内核版本,您没有运行使用initv
脚本的Debian . 当前的Debian使用systemd
,/etc/rc.d
中的脚本由systemd
的兼容性功能运行(service
命令现在是一个试图像旧的initv
命令一样的systemd
命令) .您有两种选择:
/etc/rc.local
调用脚本:这是一个相当脏的修复,因为它依赖于
systemd
的另一个兼容性功能 . 此外,脚本的位置不再重要 .uwsgi
写一个完整的systemd
服务(这就是我所做的,以及uwsgi documentation推荐的内容) . 你会需要创建一个名为/etc/systemd/system/uwsgi.service
的文件,其内容类似于:我使用emperor模式(这也是
uwsgi
推荐用于systemd
的模式),虽然可以破解它来运行单个进程uwsgi
(参见下面的进一步阅读) .您还需要启用
multi-user.target
使用的服务,该服务将在启动时运行 . 您需要以root身份执行此操作:并且
uwsgi
将从下次启动开始(它不会立即启动,启动时需要systemctl start uwsgi.service
) .进一步阅读:
The Arch linux wiki about systemd is very thorough
The Debian wiki on systemd is good, but outdated in some places (notably, it tells you that you need to install it which is not the case in Jessie)
Weezy
你在那里混合了一些东西:
chkconfig
是RedHat OS系列的一个脚本 . 让它适用于Debian在过去并不容易,我不相信现在这样做很容易 .对于每个运行级别的一个rc.d文件夹,Weezy仍然使用
initv
rc.d文件夹:您可以使用(适当命名的)
runlevel
命令检查您所在的运行级别 . 然后,您需要检查正确的/etc/rc.d/rc*.d
文件夹中是否存在脚本的软链接 . 如果脚本没有软链接,则需要添加以下内容:这几乎都是关于
initv
脚本如何工作的 . 如果你在机器启动时进入运行级别2(我相信这是Debian的默认设置),那么init
对于/etc/rc.d/rc2.d
中的每个文件只执行service <script> start
.