相关疑难解决方法(0)

使用bash和regex在一行中查找并终止进程

我经常需要在编程期间杀死进程.

我现在这样做的方式是:

[~]$ ps aux | grep 'python csp_build.py'
user    5124  1.0  0.3 214588 13852 pts/4    Sl+  11:19   0:00 python csp_build.py
user    5373  0.0  0.0   8096   960 pts/6    S+   11:20   0:00 grep python csp_build.py
[~]$ kill 5124
Run Code Online (Sandbox Code Playgroud)

如何自动提取进程ID并在同一行中终止它?

像这样:

[~]$ ps aux | grep 'python csp_build.py' | kill <regex that returns the pid>
Run Code Online (Sandbox Code Playgroud)

regex bash terminal awk

595
推荐指数
13
解决办法
46万
查看次数

如何在bash中等待多个子进程完成并返回退出代码!= 0当任何子进程以代码结束时!= 0?

如何在bash脚本中等待从该脚本生成的几个子进程完成并返回退出代码!= 0当任何子进程以代码结束时!= 0?

简单的脚本:

#!/bin/bash
for i in `seq 0 9`; do
  doCalculations $i &
done
wait
Run Code Online (Sandbox Code Playgroud)

上面的脚本将等待所有10个生成的子进程,但它总是会给出退出状态0(请参阅参考资料help wait).如何修改此脚本,以便它发现生成的子进程的退出状态,并在任何子进程以代码!= 0结束时返回退出代码1?

有没有更好的解决方案,而不是收集子流程的PID,按顺序等待它们并总结退出状态?

bash process wait

518
推荐指数
18
解决办法
48万
查看次数

获取后台进程的退出代码

我有一个命令CMD从我的主要bourne shell脚本调用,需要永远.

我想修改脚本如下:

  1. 并行运行命令CMD作为后台进程($ CMD&).
  2. 在主脚本中,每隔几秒就有一个循环来监视生成的命令.该循环还将一些消息回显到stdout,指示脚本的进度.
  3. 当生成的命令终止时退出循环.
  4. 捕获并报告生成进程的退出代码.

有人能指点我完成这个吗?

unix linux shell process

112
推荐指数
6
解决办法
13万
查看次数

我应该以什么顺序发送信号以正常关闭进程?

评论这个答案的另一个问题,该评论说:

除非绝对必要,否则不要使用kill -9!SIGKILL无法被捕获,因此被杀死的程序无法运行任何关闭例程来例如擦除临时文件.首先尝试HUP(1),然后是INT(2),然后是QUIT(3)

我原则上同意SIGKILL,但其余的对我来说都是新闻.鉴于发送的默认信号killSIGTERM,我预计它是任意进程正常关闭的最常见信号.此外,我已经看到SIGHUP用于非终止原因,例如告诉守护程序"重新读取您的配置文件".而且在我看来SIGINT(你通常用Ctrl-C得到的中断,对吗?)并没有得到应有的广泛支持,或者相当不合适地终止.

鉴于这SIGKILL是最后的手段 - 您应该向任意进程发送哪些信号以及以何种顺序发送信号,以便尽可能优雅地关闭它?

如果可以,请用支持事实(超出个人偏好或意见)或参考资料证实您的答案.

注意:我对包括考虑bash/Cygwin的最佳实践特别感兴趣.

编辑:到目前为止,似乎没有人提到INT或QUIT,并且有限提及HUP.是否有任何理由将这些包括在有序的过程中?

bash signals job-control sigterm

80
推荐指数
4
解决办法
2万
查看次数

用于捕获进程ID的Shell脚本,如果存在则将其终止

我尝试了这个代码,但它无法正常工作

#!/bin/sh

#Find the Process ID for syncapp running instance

PID=`ps -ef | grep syncapp 'awk {print $2}'`

if [[ -z "$PID" ]] then
Kill -9 PID
fi
Run Code Online (Sandbox Code Playgroud)

它在awk附近显示错误.

请给我任何建议.

bash shell scripting

59
推荐指数
4
解决办法
19万
查看次数

用于检查运行进程的Bash脚本

我写了一个bash脚本来检查进程是否正在运行.它不起作用,因为ps命令总是返回退出代码1.当我从命令行运行ps命令时,$?是正确设置,但在脚本中它总是1.任何想法?

#!/bin/bash
SERVICE=$1

ps -a | grep -v grep | grep $1 > /dev/null
result=$?
echo "exit code: ${result}"
if [ "${result}" -eq "0" ] ; then
    echo "`date`: $SERVICE service running, everything is fine"
else
    echo "`date`: $SERVICE is not running"
fi
Run Code Online (Sandbox Code Playgroud)

Bash版本:GNU bash,版本3.2.25(1)-release(x86_64-redhat-linux-gnu)

bash

54
推荐指数
7
解决办法
20万
查看次数

如何在不从PHP调用ps的情况下检查指定的PID当前是否正在运行?

我们想检查当前是否通过PHP运行指定的进程.

我们想简单地提供一个PID并查看它当前是否正在执行.

PHP有一个内部函数可以提供给我们这些信息,还是我们必须从"ps"输出中解析它?

php pid process

34
推荐指数
3
解决办法
4万
查看次数

如何检查ssh-agent是否已经在bash中运行?

我的shLinux环境中有一个示例脚本,基本上运行的ssh-agent是当前shell,为它添加一个键并运行两个git命令:

#!/bin/bash
eval "$(ssh-agent -s)"
ssh-add /home/duvdevan/.ssh/id_rsa

git -C /var/www/duvdevan/ reset --hard origin/master
git -C /var/www/duvdevan/ pull origin master
Run Code Online (Sandbox Code Playgroud)

脚本实际上运行正常,但每次运行它都会得到一个新进程,所以我认为它可能会成为一个性能问题而且我最终可能会遇到无用的进程.

输出的一个例子:

Agent pid 12109
Identity added: /home/duvdevan/.ssh/custom_rsa (rsa w/o comment)
Run Code Online (Sandbox Code Playgroud)

此外,除此之外,是否可以找到现有ssh-agent流程并将其添加到其中?

linux ssh bash shell

27
推荐指数
5
解决办法
3万
查看次数

pyqt应用程序执行更新

我有一个PyQt准备发布的应用程序.一切都运作良好,我还有一件事要结束.我喜欢自我更新的软件:

  • 检查新版本的URL;
  • 找到新版本;
  • 通知用户更新(单击)→ 更新.

问题是我不知道如何执行此更新.我检查,我发现新版本,我下载它然后我必须关闭应用程序并执行新版本的安装程序.如果我关闭它然后我不能执行任何其他,如果我执行安装程序我无法关闭应用程序.

基于一些用户选择我的程序还下载并安装了一些需要相同的第三方软件:安装程序前关闭,安装程序后重启.

pyqt updates

5
推荐指数
2
解决办法
1072
查看次数

使用Bash检查进程是否正在运行

我正在尝试使用以下代码检查进程是否正在运行:

SERVICE="./yowsup/yowsup-cli"
RESULT=`ps aux | grep $SERVICE`

if [ "${RESULT:-null}" = null ]; then
    echo "not running"
else
    echo "running"
fi
Run Code Online (Sandbox Code Playgroud)

但它仍然在回应它正在运行,虽然它不是.我意识到grep本身就是结果,这就是问题所在.

如何跳过grep并检查进程?

linux bash raspberry-pi

2
推荐指数
2
解决办法
1万
查看次数

如何测试 Bash 中是否存在进程?

我想确保node在登录时正在运行。所以在我的.bashrc文件中我有:

pkill node
sleep 1
node server.js &
Run Code Online (Sandbox Code Playgroud)

当然,这不会检查是否node正在运行......它只是杀死它并重新启动它。相反,我想要这样的东西:

node_process = $(pidof node)
if [not_exists node_process]; then
  node server.js &
fi
Run Code Online (Sandbox Code Playgroud)

问题是该not_exists方法似乎不存在:)。如何在 Bash 中测试数字或字符串是否存在,这是确保节点在登录时启动并运行的最佳方法吗?

bash shell process .bash-profile

1
推荐指数
1
解决办法
2万
查看次数