我是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并执行这些任务,或者我可以在一个脚本本身中完成它。 欢迎任何帮助。
答案 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。