【问题标题】:Shell script to avoid killing the process that started the scriptShell脚本,以避免杀死启动脚本的进程
【发布时间】:2014-12-10 13:36:12
【问题描述】:

我对 shell 脚本非常陌生,任何人都可以帮助解决一个简单的问题:我编写了一个简单的 shell 脚本,它可以: 1. 停止少数服务器。 2. 杀死user1的所有进程 3. 启动几台服务器。

此脚本在远程主机上运行。所以我需要 ssh 到机器上复制我的脚本然后运行它。另外我用来杀死所有进程的命令是:

ps -efww | grep "user1"| grep -v "sshd"| awk '{print $2}' | xargs kill

问题1:由于user1用于ssh并运行脚本。它会杀死正在运行脚本的进程并且永远不会启动服务器。谁能帮我修改上面的命令。

问题 2:如何自动化 ssh 进入机器并运行脚本的过程。 我已经尝试过期望脚本,但是我是否需要一个单独的脚本来执行这些任务,或者我可以在一个脚本本身中完成它。 欢迎任何帮助。

【问题讨论】:

    标签: linux shell unix


    【解决方案1】:

    基本上答案已经在你的脚本中了。

    只需将您的脚本从这样的已找到进程中排除

    grep -v <your script name>

    关于ssh后自动运行脚本,看看here,可以通过特殊的ssh配置来完成

    【讨论】:

      【解决方案2】:

      只需创建一个简单的脚本,例如:

      #!/bin/bash
      
      ssh user1@remotehost '
        someservers stop
        # kill processes here
        someservers start
      '
      

      为了避免在停止所有用户进程时杀死自己,请尝试在grep -v "sshd"之后添加| grep -v bash

      【讨论】:

        【解决方案3】:

        这是一个有细微差别的问题,在 shell 中不容易解决。

        最佳方法

        为了便于系统管理,我的建议是重新设计。例如,以 root 身份运行终止逻辑,这样您就可以安全地终止任何luser 进程,而不必担心锯掉您所在的分支。如果您担心进程失控,请运行它们under a timeout。等等。

        足够好的方法

        您的 ssh 登录 shell 会话将有自己的伪 tty,并且它的所有后代都可能共享它。所以,figure out that tty name 并使用该 tty 跳过任何内容:

        TTY=$(tty | sed 's!^/dev/!!')  # TTY := pts/3 e.g.
        ps -eo tty=,user=,pid=,cmd= | grep luser | grep -v -e ^$TTY -e sshd | awk ...
        

        几乎足够好的方法

        “几乎足够好”的解决方案(例如通过 ps -eo user=,pid=,cmd= | grep -v -e sshd -e fancy_script | awk ... 简单地排除当前脚本和 sshd)的问题在于它们严重依赖于调用的意外。 ps auxf 可能表明你在脚本和 sshd 之间有一个登录 shell(可能是 -bash)——你也可以输入特殊的逻辑来跳过它,但如果你的脚本的调用在未来发生变化,那将很难健壮。

        问题号呢? 2? (我怎样才能自动化 sshing...?

        好问题。题外话。试试superuser.com

        【讨论】:

          猜你喜欢
          • 2013-03-26
          • 2020-09-04
          • 2016-07-08
          • 2016-10-08
          • 2012-09-30
          • 2013-11-11
          • 1970-01-01
          • 1970-01-01
          • 2020-11-30
          相关资源
          最近更新 更多