如何使用 shell 脚本连接到 linux 服务器并停止/启动服务?

Posted

技术标签:

【中文标题】如何使用 shell 脚本连接到 linux 服务器并停止/启动服务?【英文标题】:How to connect to a linux server and stop/start a service using a shell script? 【发布时间】:2017-11-18 09:35:14 【问题描述】:

我想设置一个脚本,该脚本将连接到 linux 服务器,然后停止/启动服务。但是在服务停止和启动之间,它应该等待大约 10 秒,然后检查服务是否真的停止了。

service httpd stop
--wait 10 seconds. check ps -ef | grep httpd, kill if any hanged processes
service httpd start

有人可以帮我看看怎么做吗?

【问题讨论】:

使用sleepkill -9 而不是显式检查。 我可以使用用户名和密码连接到服务器吗?我正在检查表格,但大多数人说创建一个 ssh 密钥。我将在我想运行命令的同一台服务器上部署这个 shell 脚本 您当然可以将 ssh 服务器配置为接受密码。但不建议这样做,因为它比密钥更不安全。而且您只能以交互方式执行此操作,因此不能使用脚本。至少你不应该。 我正在尝试睡眠,但出现此错误 sleep: invalid time interval `10\r',你能告诉我如何解决这个问题吗?这是我在脚本中添加的内容:sleep 10 您显然需要指定要杀死的什么进程。如果您不确定它们的用法,请阅读您尝试使用的命令的手册页。例如man kill。在您的情况下,killall -9 /usr/sbin/httpd 可能是一个不错的选择,因为它不需要特定的进程 ID。 【参考方案1】:

wait 命令用于不同的目的,我们需要使用sleep 命令代替。

查看此链接了解详细差异。 https://***.com/a/13296927/3086531


检查进程是否正在运行的脚本

#!/bin/bash
UP=$(pgrep httpd | wc -l);
if [ "$UP" -ne 1 ];
then
        echo "httpd is down.";
else
        echo "All is well.";
fi

您的最终代码将是

#!/bin/bash

service httpd stop 

sleep 10 

UP=$(pgrep httpd | wc -l);
if [ "$UP" -ne 1 ];
then
  service httpd start  #start serivce again, since no process are found 
else
  echo "Service is not stopped yet.";
  killall -15 httpd  #Kills all processes related to httpd
  service httpd start #start httpd process
fi

【讨论】:

不需要这种复杂性。为什么还要检查是否还有一个进程,无论如何你都会硬杀它。无需检查即可触发killall -9,您就知道一切都很好。 @arkascha,应该优雅地停止进程。我们应该允许他们在终止之前执行清理程序(例如删除锁定文件、将内存中的数据刷新到硬盘等)。 然后用killall -15(或简单的killall)代替killall -9。那不是我的意思。 @arkascha,发送信号 15 (SIGTERM) 有什么问题?它是要被处理的,而 SIGKILL 不能被进程处理。 @SaiAvinash 为了将 java 应用程序作为服务运行,您需要在此处执行此过程***.com/a/11203626/3086531 或者这是您想要实现的简单解决方案***.com/a/11203634/3086531

以上是关于如何使用 shell 脚本连接到 linux 服务器并停止/启动服务?的主要内容,如果未能解决你的问题,请参考以下文章

如何从windows平台自动连接到Linux/Mac机运行shell脚本?

在 Shell 脚本中通过 JDBC 连接到 DB2

使用jsch连接到linux上,然后执行shell命令,返回的结果中存在乱码,各位大大怎么解决?

Linux Shell 脚本:将命令输出保存在变量/文件中?

如何连接到 2 个 linux 服务器以使用 talend 复制文件

如何在shell脚本中,判断一个基本命令执行是不是成功