`ps|查询 | Kill`​​ 过早中止我的脚本

`ps|查询 | Kill`​​ 过早中止我的脚本

我有一台 Linux 计算机,可以通过 SSH 远程使用普林克在一台Windows XP机器上。我有一个 Plink 程序设置为使用自动登录在脚本中执行命令:

plink -ssh [domain name] -l [username] -pw [password] -m commands.txt >> Outputtext.txt

commands.txt仅包含以下内容

echo "Killing process"
ps -ef | grep 'processname' | awk ‘{print $2}’ | head -n 1` | xargs kill -9
sleep 2
echo "Restarting process"
processd &

echo "Exiting..."

该脚本只是搜索进程名,将其杀死然后重新启动。如果在我执行脚本之前进程实际上在 Linux 上启动,那么它每次都会起作用。但是,如果该进程未启动,它实际上会杀死控制终端并plink.exe根据ps -ef命令退出。

我已经缩小范围,当我这样做时,ps -ef | grep 'processname'它将返回两个 PID,一个是我正在搜索的进程,另一个是 grep processname PID 本身

当进程未启动时,它只会返回一个 PID,grep 'processname'我认为kill -9正在终止该进程并以某种方式终止 plink 连接或控制终端?有没有办法解决?

或者检查是否grep 'processname'返回 2 行意味着进程已启动,或者如果只有 1 行则不要终止它。

不确定是否可以echo "#!bash"输出 bash 脚本然后执行该 bash 脚本?

或者这是 plink 中的一个奇怪的错误?

答案1

你的命令行对我来说真的很奇怪:

ps -ef | grep 'processname' | awk ‘{print $2}’ | head -n 1 | xargs kill -9
  1. 您将awk的输出提供给(即可以完美过滤其输入的程序,更强大的程序)grep
  2. awk您将(即可以完美过滤其输出的程序)的输出传输到head.
  3. xargs绝对只用于一个参数。

因此,独立于更好的方法(并且这个问题是重复的),我觉得有必要纠正这个问题:

kill -9 $(ps -ef | awk '/processname/ {print $2;exit;}')

答案2

限制ps只查找命令并输出您关心的信息。

ps -C processname -o pid

不过,在尝试实际杀死任何内容之前,您可能需要检查命令的结果代码。

相关内容