【问题标题】:How to connect to a linux server and stop/start a service using a shell script?如何使用 shell 脚本连接到 linux 服务器并停止/启动服务?
【发布时间】: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。

标签: linux shell


【解决方案1】:

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

查看此链接了解详细差异。 https://stackoverflow.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 应用程序作为服务运行,您需要在此处执行此过程stackoverflow.com/a/11203626/3086531 或者这是您想要实现的简单解决方案stackoverflow.com/a/11203634/3086531
猜你喜欢
  • 2016-12-03
  • 2018-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-08
  • 1970-01-01
  • 2012-11-19
  • 1970-01-01
相关资源
最近更新 更多