排他性(不能重复启动)Server开发(deamon)—进程排他性(文件锁)—脚本排他性(fuser)
原文:
1、进程排他性:
在Linux中进行Server开发::
第一步、deamon() //调用deamon将进程转后台。
第二步、加文件写锁:
fd = open(“filename”,
O_CREAT|O_WRONLY,0666);
struct flock stLock;
/*文件锁的数据结构*/
stLock.l_type =
F_WRLCK;
/*l_type的取值可以是:F_WRLCK、F_RDLCK或F_UNLCK*/
stLock.l_whence =
SEEK_SET;
/*l_whence的取值可以是:SEEK_SET、SEEK_CUR、SEEK_END*/
stLock.l_start =
0;
/*偏移字节,相对于whence的偏移字节*/
stLock.l_len =
0;
/*
从l_whence+l_start开始,对文件中的l_len个字节加锁,
0表示加锁到EOF,即文件结束。
*/
fcntl(fd,F_SETLK,&stLock);
/*
加锁时,cmd可以取值F_SETLK或F_SETLKW;
*/
2、脚本排他性:
(
fuser filename,查看使用filename的进程PID,
注意::vim filename这种监控不到。
fuser filename 可以查看使用filename的进程PID,
通过这个简介的判断filename(可执行程序)有没有运行,
当然,也不一定完全合理,可能只在编译,也被认为是已经启动了。
(不过,这个确实已经是最好的方法了。)
)
如果在脚本上加上个排他性的检查,发现该脚本正在执行的时候,第二次的执行就自动退出并给出提示可以避免一些人为的疏忽。
下面是一个例子通过fuser来检查当前脚本是否正在执行,如果正在执行则提示并退出脚本。
#!/bin/bash
下面是一个例子通过fuser来检查当前脚本是否正在执行,如果正在执行则提示并退出脚本。
#!/bin/bash
if fuser $0 2> /dev/null | sed "s/\\<$$\\>//" | grep -q '[0-9]'; then
echo 'Script is already running...' 1>&2
exit 1
fi
echo 'Script is already running...' 1>&2
exit 1
fi
#program starts here #即在这里编写自己的shell脚本。
sleep 60
echo "=end="