bash脚本 - 杀死所有相同的进程而不是这个进程

时间:2016-07-18 11:38:27

标签: bash csh tcsh

我手动运行了一个(bash或csh)脚本...名为myScript.sh

我想检查是否有其他实例运行并杀死它们,然后开始执行它的工作。

我试过了:

ps -ef | grep "myScript.sh" | grep -v grep | awk '{print $2}' | xargs kill -9

但它也会发现自己并杀死其他一切,然后自杀!!!

任何聪明的快速方式来杀死其余的? (不必在另一个包装脚本上执行)??

3 个答案:

答案 0 :(得分:1)

从传递给xargs的列表中过滤当前调用的进程ID:

me=$$
ps -ef | grep '[m]yScript.sh' | awk -v me=$me '$2 != me {print $2}' | xargs kill
但是,更好的想法是,如果myScript.sh在启动时检测到另一个自身运行的实例,则只是阻止alreadyrunning=/tmp/foo if [[ -f $alreadyrunning ]]; then exit else trap "rm $alreadyrunning" EXIT touch "$alreadyrunning" chmod +644 "$alreadyrunning" fi 继续。将这样的内容添加到脚本的开头:

$alreadyrunning

这不是万无一失的(如果你的脚本的两个实例几乎在同一时间开始就存在竞争条件),但一般情况下,如果没有其他实例已经创建var app = angular.module('plunker', []); app.controller('MainCtrl', function($scope) { $scope.medicinelist = [ {medicine: 'AMLOPRES 5MG TABLET'}, {medicine: 'ARGIPREG SACHET'}, {medicine: 'ALCIPRO 500MG TABLET'} , {medicine: 'PROLOMET AM 50MG TABLET'}, {medicine: 'PROLOMET AM 5MG TABLET'}, {medicine: 'AB PHYLLINE 200MG TABLET SR'} , {medicine: 'ACIVIR 800MG TABLET DT'}, {medicine: 'CEPODEM AZ TABLET'}, {medicine: 'ECOSPRIN AV 10MG CAPSULE'}, {medicine: 'ECOSPRIN AV 150MG CAPSULE'} , {medicine: 'ATORLIP 40MG TABLET'}, {medicine: 'AMTAS 5MG TABLET'}, {medicine: 'ARKAMIN 100MG TABLET'} , {medicine: 'AMPOXIN 500MG INJECTION'} ]; $scope.medicinedrop = [{medicine: 'TEST'}]; $scope.medicinedrop = $scope.medicinelist.concat($scope.medicinedrop); console.log($scope.medicinedrop); });,它只允许脚本继续运行。

答案 1 :(得分:0)

根据您如何开始编写脚本,可能需要将-f标记添加到pgrep

pgrep "myScript.sh" | grep -v "$$" | xargs kill -9

答案 2 :(得分:0)

您可以做的最短的事情是以下

kill $(pgrep -x myScript.sh | grep -v ^$$$)

请注意,当您的PID为303且列表为303 1012 13032 3039时,您必须匹配完整的pid,以便不排除130323039。< / p>