Shell脚本可以避免杀死启动脚本的进程

时间:2014-12-10 13:36:12

标签: linux shell unix

我是shell脚本的新手,任何人都可以帮助解决一个简单的问题:我编写了一个简单的shell脚本: 1.停止几台服务器。 2.用户1杀死所有进程 3.启动几台服务器。

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

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

问题1:因为user1用于ssh并运行脚本。它会终止运行脚本的进程,永远不会启动server.can任何人都可以帮我修改上面的命令。

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

3 个答案:

答案 0 :(得分:2)

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

只需将脚本排除在此类

之类的已找到进程中

grep -v <your script name>

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

答案 1 :(得分:1)

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

#!/bin/bash

ssh user1@remotehost '
  someservers stop
  # kill processes here
  someservers start
'

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

答案 2 :(得分:0)

这是一个细微差别的问题,而不是直接在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(可能是-bash)之间有一个登录shell - 你可以放入特殊的逻辑来跳过它,但是如果你的脚本的调用改变了,那就不是很强大了在将来。

问题没有。 2? (如何自动化sshing ......?

好问题。无关。试试superuser.com