[英]Shell script to avoid killing the process that started the script
我对Shell脚本非常陌生,任何人都可以帮助解决一个简单的问题:我编写了一个简单的Shell脚本,该脚本可以:1.停止几个服务器。 2.由user1终止所有进程。3.启动少量服务器。
该脚本在远程主机上运行。 所以我需要将ssh拷贝到计算机上,然后再运行脚本。 我用来杀死所有进程的命令是:
ps -efww | grep "user1"| grep -v "sshd"| awk '{print $2}' | xargs kill
问题1:由于user1用于ssh和运行脚本,它会杀死正在运行脚本的进程并且永远不会启动服务器。任何人都可以帮助我修改以上命令。
问题2:如何自动执行切入机器并运行脚本的过程。 我已经尝试过期望脚本,但是我是否需要一个单独的脚本来执行和执行这些任务,或者我可以用一个脚本本身来完成它。 欢迎任何帮助。
只需创建一个简单的脚本,如:
#!/bin/bash
ssh user1@remotehost '
someservers stop
# kill processes here
someservers start
'
为了避免在停止所有用户进程时杀死自己,请尝试添加| grep -v bash
| grep -v bash
grep -v "sshd"
之后, | grep -v bash
这是一个细微的问题,不是直接在Shell中解决的问题。
最好的方法
为了简化系统管理,我的建议是重新设计。 例如,以root用户身份运行killing逻辑,因此您可以安全地终止所有luser
进程,而不必担心切断您所在的分支。 如果您担心流程失控,请在超时下运行它们。 等等。
足够好的方法
您的ssh登录shell会话将具有其自己的伪tty,并且其所有后代都可能会共享它。 因此, 找出该tty名称并跳过与该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 -eo user=,pid=,cmd= | grep -v -e sshd -e fancy_script | awk ...
ps -eo user=,pid=,cmd= | grep -v -e sshd -e fancy_script | awk ...
ps -eo user=,pid=,cmd= | grep -v -e sshd -e fancy_script | awk ...
)是他们严重依赖调用的偶然性。 ps auxf
可能显示出您的脚本和sshd(可能是-bash
)之间有一个登录shell —您也可以采用特殊的逻辑来跳过该登录壳,但是如果将来脚本的调用发生变化,这将很难实现。
那问题号呢? 2? ( 如何自动执行sshing ...? )
好问题。 无关。 尝试superuser.com 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.