【问题标题】:Webapp update shell scriptWebapp 更新 shell 脚本
【发布时间】:2010-02-01 08:26:32
【问题描述】:

我觉得问这个很傻......

我不是 shell 脚本方面的专家,但我终于拥有了足够的系统管理员角色,我想正确地做到这一点。

我有一个托管 web 应用程序的生产服务器。这是我的日常。
1 - SSH 到服务器
2 - cd django_src/django_apps/team_proj
3 - svn 更新
4 - sudo /etc/init.d/apache2 重启
5 - 注销

我想为步骤 2、3、4 创建一个 shell 脚本。

我可以这样做,但这将是一个非常简单的 bash 脚本,只包含我在命令行中键入的实际命令。

我的问题:在 bash(Linux、Ubuntu)中为远程服务器编写这种重复过程的脚本最佳方法是什么?

谢谢!

【问题讨论】:

  • 一个编程问题,但如果您是系统管理员,您可能希望向 ServerFault 而不是 StackOverflow 提交更多这样的问题。
  • 我怎么错过了那个网站!感谢您的指点。我不是真正的系统管理员,我只是像许多程序员一样做一些必要的事情。

标签: linux bash shell unix scripting


【解决方案1】:

最好的方法就是按照您的建议。您应该为您的脚本做的一些事情是:

  • set -e 放在脚本的顶部(在shebang 之后)。如果任何命令失败,这将导致您的脚本停止。所以如果它不能 cd 到目录,它就不会运行svn update 或重新启动 apache。您可以通过在每个命令后添加|| exit 0 以编程方式执行此操作,但如果这就是您所做的全部,您也可以使用set -e
  • 在脚本中使用完整路径。不要假定运行脚本的目录。在这种特定情况下,cd 命令具有相对路径。使用完整(绝对)路径,或使用 $HOME 之类的环境变量。
  • 您可能需要设置 sudo 以便它可以运行命令而无需输入密码。这使您的脚本非交互式,这意味着它可以在后台运行,也可以从 cron 作业等运行。

随着时间的推移,您可以添加功能并使用命令行参数来参数化脚本。但是不要费心在前面做这件事。只需根据需要改进脚本即可。

【讨论】:

  • 如何设置 sudo 使其不要求输入密码?
  • 不要忘记为 ssh 创建公钥/私钥,以便您可以从自动化脚本运行 ssh。
【解决方案2】:

简单的 bash 脚本只包含您在命令行中键入的实际命令并没有错。不要让它变得过于复杂。

【讨论】:

    【解决方案3】:

    我会自动设置一个 cron 作业。

    【讨论】:

      【解决方案4】:

      由于您使用的是 python,请查看fabric - 您可以使用它来自动执行此类任务。首先安装面料:

      $ sudo easy_install fabric
      

      然后编写你的结构脚本:

      from __future__ import with_statement
      from fabric.api import *
      
      def svnupdate():
          with cd('django_src/django_apps/team_proj'):
              run('svn update')
              sudo('/etc/init.d/apache2 restart')
      

      另存为fabfile.py,然后使用fab 命令运行:

      $ fab -H hostname svnupdate
      

      告诉我这不酷! :-)

      【讨论】:

      • 谁说提问者使用的是 Python ?
      • @gareth_bowles:他正在从内部 svn 部署 django 应用程序 - 假设他至少知道一点 python 可能是安全的;)
      • 好问题!他正在使用 django,这是一个用于 web 开发的 python 框架(有点像 Ruby on Rails,但在 python 中)
      • 哦,我知道 python ;) 我需要在服务器上安装任何东西来支持结构吗?
      • Hi Art - 依赖项记录在 docs.fabfile.org/0.9.0/installation.html - 您需要 Python 2.5 或更高版本、Setuptools 和 PyCrypto。在我在这些依赖项上使用过结构的每个系统上,都已经安装了结构,并且结构“正常工作”。如果您尚未安装依赖项,请查看安装链接以获取更多信息和找到依赖项的位置的指针。
      【解决方案5】:

      您可以使用 shell(bash、ksh、zsh + ssh + 工具)或 Python、Perl(Ruby 或 PHP 或 Java)等编程语言来执行此操作,基本上是一种支持 SSH 协议和操作系统功能的语言. “最好的”一个是你更舒服和有知识的那个。如果你在做系统管理员,shell是你可以使用的最接近的东西。然后在你完成你的脚本之后,你可以使用 crontab (cron) 或者 at 命令来安排你的任务。查看他们的手册页了解更多信息

      【讨论】:

        【解决方案6】:

        您可以使用 bash/Bourne 等轻松完成上述操作。

        但是,我会花时间和精力学习 Perl(或一些类似的强大脚本语言)。为什么?

        1. 语言结构更强大
        2. 与您想要编写脚本的系统/功能接口的库数不胜数
        3. 由于库支持,您不必生成不同的命令来实现您想要的(在加载的系统上可能很有价值)
        4. 您可以将常用脚本分解到自己的库中以备后用

        我选择 Perl 尤其是因为它是为这类任务而设计的(也许 设计 对 Perl 来说这个词太强了)。不过,您可能想查看 Ruby/Python 或 SO 贡献者的其他建议。

        【讨论】:

          【解决方案7】:

          有关基本步骤,请查看 camh 的答案。如果您打算通过 cron 运行脚本,那么实现一些简单的日志记录,例如通过将带有退出代码的每个命令的开始时间附加到一个文本文件中,您可以稍后分析该脚本是否失败。

          【讨论】:

            【解决方案8】:

            期望——编写交互式应用程序

            Expect 是一个用于自动化交互式应用程序的工具,例如 telnet、ftp、passwd、fsck、rlogin、tip 等。Expect 可以轻松完成所有其他任务都非常困难的任务。您会发现 Expect 是一个绝对无价的工具 - 使用它,您将能够自动化您以前从未想过的任务 - 您将能够快速轻松地完成此自动化。

            http://expect.nist.gov

            奖金:您在工作中的税金!

            【讨论】:

              【解决方案9】:

              我可能会做这样的事情......

              project_update.sh

              
              #!/bin/bash
              #
              # $1 - user@host
              # $2 - project directory
              
              [[ -z $1 || -z $2 ]] && { echo "usage: $(basename $0) user@host project_dir"; exit 1; }
              
              declare host=$1 proj_dir=$2
              
              ssh $host "cd $proj_dir;svn update;sudo /etc/init.d/apache2 restart" && echo "Success"
              

              【讨论】:

                【解决方案10】:

                只是添加另一个提示 - 您不应该让用户访问处于未知状态的某些应用程序。 svn up 可能会在更新期间中断,用户可能会看到一个半新半旧的页面等。如果您要立即部署整个应用程序,我建议您将 svn export 改为一个新目录,然后mv current old ; mv new current,或者甚至保留current 作为您现在使用的目录的链接。仍然不完美,也没有阻止所有可能的竞争条件,但它肯定比 Live Copy 上的svn up 花费的时间更少。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2023-03-05
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-10-17
                  相关资源
                  最近更新 更多