Webapp更新shell脚本

时间:2010-02-01 08:26:32

标签: linux bash shell unix scripting

我觉得这很傻......

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

我有一个托管webapp的生产服务器。这是我的惯例。
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)中为远程服务器编写这种重复过程的最佳方法是什么?

谢谢!

10 个答案:

答案 0 :(得分:4)

最好的方法就像你建议的那样。你应该为你的脚本做的一些事情是:

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

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

答案 1 :(得分:4)

简单的bash脚本简单地包含您在命令行输入的实际命令没有任何问题。不要让它变得比必要的复杂。

答案 2 :(得分:2)

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

答案 3 :(得分:2)

由于您正在使用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

告诉我这不酷! : - )

答案 4 :(得分:1)

你可以使用shell(bash,ksh,zsh + ssh + tools)或编程语言(如Python,Perl(Ruby或PHP或Java)等)来实现这一点,基本上是一种支持SSH协议和操作系统功能的语言。 “最好”的是你更舒服并且掌握了知识的那个。如果你正在使用sysadmin,那么shell是你可以使用的最接近的东西。完成脚本后,可以使用crontab(cron)或at命令来安排任务。查看他们的手册页以获取更多信息

答案 5 :(得分:1)

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

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

  1. 语言结构更强大
  2. 没有与您想要编写脚本的系统/功能接口的库的结尾
  3. 由于库支持,您不必产生不同的命令来实现您想要的(在加载的系统上可能有价值)
  4. 您可以将常用脚本分解到自己的库中供以后使用
  5. 我特别选择Perl,因为它是针对这些任务设计的(可能设计对于Perl来说太强大了)。但是,您可能需要查看来自SO贡献者的Ruby / Python或其他建议。

答案 6 :(得分:1)

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

答案 7 :(得分:1)

期望 - 编写交互式应用程序脚本

  

Expect是一个自动化交互式应用程序的工具,如telnet,f​​tp,passwd,fsck,rlogin,tip等等。期望可以轻松完成各种其他任务非常困难的任务。你会发现Expect是一个绝对宝贵的工具 - 使用它,你将能够自动执行你以前从未想过的任务 - 并且你将能够快速,轻松地完成这种自动化。

http://expect.nist.gov

奖金:您的税金在工作!

答案 8 :(得分:0)

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

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"

答案 9 :(得分:0)

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