【问题标题】:Why is my script to start UWSGI not functioning at bootup?为什么我的启动 UWSGI 的脚本在启动时不起作用?
【发布时间】:2016-11-15 18:56:49
【问题描述】:

不知道你能不能帮忙。

我正在运行以下版本:

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

我注意到我试图在启动时执行的脚本的所有运行时级别都设置为关闭。

我运行了以下命令

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 命令和相同的开关签名,所以我相当确信这是系统的一部分正在启动 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 如上所述。所以它似乎已经单独安装到主操作系统安装(因为我有更高版本的 Debian,默认情况下它没有安装在我的系统上) - 所以也许有一些与 systemd 相关的东西导致脚本在实时服务器上启动,但我不太确定。

【问题讨论】:

    标签: linux debian uwsgi systemd init.d


    【解决方案1】:

    杰西

    在最近的 Debian (Jessie) 中,initv 脚本无法正常工作。并且鉴于您的内核版本,您没有运行使用 initv 脚本的 Debian。当前的 Debian 使用systemd/etc/rc.d 中的脚本由systemd 的兼容性特性运行(service 命令现在是systemd 命令,它试图表现得像旧的initv 命令)。

    你有两个选择:

    • 添加一行从/etc/rc.local调用脚本:

      /etc/rc.d/script.sh
      

      这是一个相当肮脏的修复,因为它依赖于systemd 的另一个兼容性特性。此外,脚本的位置也不再重要了。

    • uwsgi 写一个完整的systemd 服务(这是我所做的,也是uwsgi documentation 推荐的)。您需要创建一个名为 /etc/systemd/system/uwsgi.service 的文件,其内容类似于:

      [Unit]
      Description=uwsgi emperor
      After=rsyslog.service
      
      [Service]
      PIDFile=/run/uwsgi-emperor.pid
      ExecStart=/bin/uwsgi --ini /etc/uwsgi/emperor.ini
      ExecReload=/bin/uwsgi --reload /run/uwsgi-emperor.pid
      ExecStop=/bin/uwsgi --stop /run/uwsgi-emperor.pid
      Restart=always
      KillSignal=SIGQUIT
      Type=notify
      StandardError=syslog
      NotifyAccess=all
      
      [Install]
      WantedBy=multi-user.target
      

      我使用皇帝模式(这也是uwsgi 推荐用于systemd 的模式),尽管可以破解它以运行单个进程uwsgi(请参阅下面的进一步阅读)。

      您还需要启用multi-user.target 使用的服务,该服务将在启动时运行。您需要以 root 身份执行此操作:

      systemctl enable uwsgi.service
      

      uwsgi 将在下一次启动时启动(它不会立即启动,要使其启动,您需要 systemctl start uwsgi.service)。

    进一步阅读:


    呸呸呸

    你把事情搞混了:chkconfig 是 RedHat 系列操作系统的脚本。过去让它为 Debian 工作并不容易,我认为现在做到这一点并不容易。

    Weezy 仍然使用initv rc.d 文件夹好吧,对于每个运行级别一个 rc.d 文件夹:

    /etc/rc.d/rc0.d/
    /etc/rc.d/rc1.d/
    /etc/rc.d/rc2.d/
    /etc/rc.d/rc3.d/
    /etc/rc.d/rc4.d/
    /etc/rc.d/rc5.d/
    /etc/rc.d/rc6.d/
    

    您可以使用(适当命名的)runlevel 命令检查您所在的运行级别。然后您需要检查在正确的/etc/rc.d/rc*.d 文件夹中是否有指向脚本的软链接。如果没有指向脚本的软链接,您需要使用以下几行添加它:

    ln -s /etc/rc.d/init.d/script.dh /etc/rc.d/rc$(runlevel | cut -d ' ' -f 2).d/script.sh
    

    这几乎就是initv 脚本如何工作的全部内容。如果您在机器启动时进入运行级别 2(我相信这是 Debian 上的默认设置),init/etc/rc.d/rc2.d 中的每个文件执行的操作只是service <script> start

    【讨论】:

    • 您好,grochmal,感谢您周到而详细的回复。我在服务器上运行 Debian Wheezy。我已经检查并且 systemd 似乎不是在实时服务器上启动它的手段,我正在尝试尽可能接近地复制该设置。我在底部更新了我的问题并进行了编辑,以分享有关此的更多信息。感谢您迄今为止的意见,非常感谢。
    • 关于 chkconfig - 我使用 apt-get chkconfig 安装了它,除了官方的 Debian 源,我没有向我的 /etc/apt/sources.list 添加任何其他源,它安装得很好,我假设这意味着它可能被 Debian“批准”并且可能工作正常,你认为这是一个错误的假设吗?非常感谢。
    • @ICMediaT - 哦,太酷了,因为你快到了。我已经用 weezy 信息更新了答案。 (但留下了 jessie 信息,现在标题为“jessie”,以防有人通过谷歌搜索找到)
    • 再次感谢您的努力 grochmal,我检查了实时服务器,没有 rc.d 文件夹,我检查了测试服务器,也没有 rc.d 文件夹。两者都在 /etc 中有一个 rc.local,但这个文件在两台机器上都是空的。所以必须有其他方法可以在启动时自动启动 Debian Wheezy 中的脚本。
    • @ICMediaT - 可以在/etc/inittab/etc/init/rc-sysinit.conf 中更改文件的位置(同样,取决于配置)
    猜你喜欢
    • 1970-01-01
    • 2020-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-04
    • 2014-11-10
    • 2010-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多