繁体   English   中英

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

[英]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:如何自动执行切入机器并运行脚本的过程。 我已经尝试过期望脚本,但是我是否需要一个单独的脚本来执行和执行这些任务,或者我可以用一个脚本本身来完成它。 欢迎任何帮助。

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

只是从这样的找到的进程中排除您的脚本

grep -v <your script name>

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

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

#!/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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM