Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux Webapp更新shell脚本_Linux_Bash_Shell_Unix_Scripting - Fatal编程技术网

Linux Webapp更新shell脚本

Linux Webapp更新shell脚本,linux,bash,shell,unix,scripting,Linux,Bash,Shell,Unix,Scripting,问这个我觉得很傻 我不是shell脚本方面的专家,但我最终担任了足够多的系统管理员角色,我希望能够正确地完成这项工作 我有一个承载webapp的生产服务器。这是我的例行公事。 1-ssh到服务器 2-cd django_src/django_应用程序/团队项目 3-svn更新 4-sudo/etc/init.d/apache2重新启动 5-注销 我想为步骤2、3、4创建一个shell脚本 我可以这样做,但它将是一个非常简单的bash脚本,只包含我在命令行中键入的实际命令 我的问题:在bash(L

问这个我觉得很傻

我不是shell脚本方面的专家,但我最终担任了足够多的系统管理员角色,我希望能够正确地完成这项工作

我有一个承载webapp的生产服务器。这是我的例行公事。
1-ssh到服务器
2-cd django_src/django_应用程序/团队项目
3-svn更新
4-sudo/etc/init.d/apache2重新启动
5-注销

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

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

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


谢谢

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

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

最好的方法就是按照您的建议。您应该为脚本执行以下操作:

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

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

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

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

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

  • 语言结构更强大
  • 要编写脚本的系统/功能的接口没有尽头的库
  • 由于库的支持,您不必生成不同的命令来实现所需的功能(在加载的系统上可能很有价值)
  • 您可以将经常使用的脚本分解到自己的库中,以供以后使用

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

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

    预期--为交互式应用程序编写脚本。

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


    奖金:你的税金在工作中

    既然您使用的是python,请查看—您可以使用它来自动化此类任务。首先安装结构:

    $ 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
    

    告诉我这不酷!:-)

    我可能会这样做

    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"
    

    只需添加另一个提示-您不应该让用户在未知状态下访问某个应用程序
    svn up
    在更新过程中可能会中断,用户可能会看到半新半旧的页面,等等。如果您同时部署整个应用程序,我建议您执行
    svn export
    操作,而不是将其导出到新目录,然后执行
    mv current old;mv new current
    ,甚至保持
    最新
    作为指向您现在使用的目录的链接。仍然不完美,也没有阻止所有可能的竞争条件,但它所花费的时间肯定比实时拷贝上的
    svn up
    要少。

    如何设置sudo,使其不请求密码?不要忘记为ssh创建公钥/私钥,以便可以从自动脚本运行ssh。这是一个编程问题,但是如果你是系统管理员,你可能想向ServerFault提交更多类似的问题,而不是StackOverflow。我怎么会错过这个网站!谢谢你的指点。我并不是一个真正的系统管理员,我只是像许多程序员一样做一些必要的工作。谁说提问者使用的是Python?@gareth_bowles:他正在从内部svn部署django应用程序-可以肯定的是,他至少懂一点Python;)好问题!他使用的是django,这是一个用于web开发的python框架(有点像RubyonRails,但在python中)哦,我知道python;)我是否需要在服务器上安装任何东西以连接到s