bash脚本中如何保证只有一个该脚本在运行

sh/bash/dash/ksh/zsh等Shell脚本
回复
bbqwinner
帖子: 28
注册时间: 2010-12-28 12:58
送出感谢: 0
接收感谢: 0

bash脚本中如何保证只有一个该脚本在运行

#1

帖子 bbqwinner » 2011-01-03 0:39

我的意思是如何在运行脚本的主程序前检查一下有没有其他同名的程序在运行,如果有,结束它们再继续运行下面的程序

我开始写的是if pgrep “***” then killall “***”
但是当我运行后发现因为在运行的脚本就是叫这个名字,所以就被killall掉了…………

因该怎么写呢???
头像
lilydjwg
论坛版主
帖子: 4163
注册时间: 2009-04-11 23:46
系统: Arch Linux
送出感谢: 11 次
接收感谢: 127 次
联系:

Re: bash脚本中如何保证只有一个该脚本在运行

#2

帖子 lilydjwg » 2011-01-03 1:09

把 pid 写到某个文件中。
头像
cnkilior
论坛版主
帖子: 4979
注册时间: 2007-08-05 17:40
送出感谢: 0
接收感谢: 5 次

Re: bash脚本中如何保证只有一个该脚本在运行

#3

帖子 cnkilior » 2011-01-03 1:14

代码: 全选

if [ -f $LOCK ];then
     exit 1
else
    touch $LOCK
fi
LarmBr
帖子: 39
注册时间: 2010-03-14 21:25
送出感谢: 0
接收感谢: 0

Re: bash脚本中如何保证只有一个该脚本在运行

#4

帖子 LarmBr » 2011-01-03 15:31

呵呵,我模仿内核用锁文件。在脚本开头检测是否有锁文件存在,有就退出。没有就创建一个锁文件。在脚本执行完要退出的地方把锁文件删除。注意,任何有可能退出的地方都要删除。
头像
lilydjwg
论坛版主
帖子: 4163
注册时间: 2009-04-11 23:46
系统: Arch Linux
送出感谢: 11 次
接收感谢: 127 次
联系:

Re: bash脚本中如何保证只有一个该脚本在运行

#5

帖子 lilydjwg » 2011-01-03 16:37

LarmBr 写了:呵呵,我模仿内核用锁文件。在脚本开头检测是否有锁文件存在,有就退出。没有就创建一个锁文件。在脚本执行完要退出的地方把锁文件删除。注意,任何有可能退出的地方都要删除。
应该有 trap 可以在退出之前执行吧。这个 zsh 是有的。
only_one
帖子: 186
注册时间: 2010-05-25 16:49
送出感谢: 0
接收感谢: 0

Re: bash脚本中如何保证只有一个该脚本在运行

#6

帖子 only_one » 2011-01-04 13:39

最简单的方法是
pidof $0 && exit 1
但要注意脚本的名字
头像
xiooli
帖子: 6956
注册时间: 2007-11-19 21:51
来自: 成都
送出感谢: 0
接收感谢: 3 次
联系:

Re: bash脚本中如何保证只有一个该脚本在运行

#7

帖子 xiooli » 2011-01-04 13:42

lock文件不错,启动时候先检查下有没有对应pid的程序在运行,没有的话就直接执行。
rediscover
帖子: 3173
注册时间: 2010-01-13 23:26
送出感谢: 0
接收感谢: 12 次

Re: bash脚本中如何保证只有一个该脚本在运行

#8

帖子 rediscover » 2011-01-04 14:42

还是lock文件好。
Here I am.
Ubuntu 桌面培训 - 全中文官方文档,含汉化截图,提供PDF
bbqwinner
帖子: 28
注册时间: 2010-12-28 12:58
送出感谢: 0
接收感谢: 0

Re: bash脚本中如何保证只有一个该脚本在运行

#9

帖子 bbqwinner » 2011-01-04 23:23

LarmBr 写了:呵呵,我模仿内核用锁文件。在脚本开头检测是否有锁文件存在,有就退出。没有就创建一个锁文件。在脚本执行完要退出的地方把锁文件删除。注意,任何有可能退出的地方都要删除。
但是我想问对于不同用户来说应该把lock文件放到哪里呢,如何保证这个文件所有用户都可以创建而且所有用户都可以找到这个位置呢?
我是说对于普通用户而言只能在自己的home文件夹内创建文件,但是其他用户不一定能访问它。
头像
lilydjwg
论坛版主
帖子: 4163
注册时间: 2009-04-11 23:46
系统: Arch Linux
送出感谢: 11 次
接收感谢: 127 次
联系:

Re: bash脚本中如何保证只有一个该脚本在运行

#10

帖子 lilydjwg » 2011-01-04 23:47

bbqwinner 写了:
LarmBr 写了:呵呵,我模仿内核用锁文件。在脚本开头检测是否有锁文件存在,有就退出。没有就创建一个锁文件。在脚本执行完要退出的地方把锁文件删除。注意,任何有可能退出的地方都要删除。
但是我想问对于不同用户来说应该把lock文件放到哪里呢,如何保证这个文件所有用户都可以创建而且所有用户都可以找到这个位置呢?
我是说对于普通用户而言只能在自己的home文件夹内创建文件,但是其他用户不一定能访问它。
/tmp
bbqwinner
帖子: 28
注册时间: 2010-12-28 12:58
送出感谢: 0
接收感谢: 0

Re: bash脚本中如何保证只有一个该脚本在运行

#11

帖子 bbqwinner » 2011-01-04 23:57

lilydjwg 写了:
bbqwinner 写了:
LarmBr 写了:呵呵,我模仿内核用锁文件。在脚本开头检测是否有锁文件存在,有就退出。没有就创建一个锁文件。在脚本执行完要退出的地方把锁文件删除。注意,任何有可能退出的地方都要删除。
但是我想问对于不同用户来说应该把lock文件放到哪里呢,如何保证这个文件所有用户都可以创建而且所有用户都可以找到这个位置呢?
我是说对于普通用户而言只能在自己的home文件夹内创建文件,但是其他用户不一定能访问它。
/tmp
恩,这样好!/tmp是所有用户可读写的 :em06
bbqwinner
帖子: 28
注册时间: 2010-12-28 12:58
送出感谢: 0
接收感谢: 0

Re: bash脚本中如何保证只有一个该脚本在运行

#12

帖子 bbqwinner » 2011-01-05 0:03

only_one 写了:最简单的方法是
pidof $0 && exit 1
但要注意脚本的名字
我试了下,好像不大行啊~
test.sh
===================

#!/bin/bash
pidof $0 && exit 1
echo "HI"
sleep 100
===================
我先运行一个,再运行另一个,发现没有象预想的一样退出 :em20
能不能详细解释下这个命令呢?
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙
送出感谢: 4 次
接收感谢: 256 次

Re: bash脚本中如何保证只有一个该脚本在运行

#13

帖子 eexpress » 2011-01-05 10:23

dtach -n /tmp/dtach-xxxx xxxxx

通常我都是这样。方便判断的。
● 鸣学
回复

回到 “Shell脚本”