我手动运行了一个(bash或csh)脚本...名为myScript.sh
我想检查是否有其他实例运行并杀死它们,然后开始执行它的工作。
我试过了:
ps -ef | grep "myScript.sh" | grep -v grep | awk '{print $2}' | xargs kill -9
但它也会发现自己并杀死其他一切,然后自杀!!!
任何聪明的快速方式来杀死其余的? (不必在另一个包装脚本上执行)??
答案 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,以便不排除13032
或3039
。< / p>