当前位置: 技术问答>linux和unix
Unix下如何防止程序的二重启动?
来源: 互联网 发布时间:2015-06-06
本文导语: 就是同一时间里该程序只能有一份在运行 代码里如何实现? | 用文件锁的方式就可以了。具体的看APUE文件锁的相关部分,里边有实现。 这个问题很多人问过,楼主解决后贴上来提交FAQ吧,造...
就是同一时间里该程序只能有一份在运行
代码里如何实现?
代码里如何实现?
|
用文件锁的方式就可以了。具体的看APUE文件锁的相关部分,里边有实现。
这个问题很多人问过,楼主解决后贴上来提交FAQ吧,造福大家。
这个问题很多人问过,楼主解决后贴上来提交FAQ吧,造福大家。
|
共享内存吧,初始化一块内存,如果运行作标记
|
共享内存不行,程序异常退出共享内存不会销毁。
|
mutex
lock
lock
|
程序运行的时候记录pid到文件中,程序运行时判断一下指定的进程是否在运行。当然不是很可靠哦。
|
syslogd用的就是文件的方法:
int check_pid (char *pidfile)
{
int pid = read_pid(pidfile);
/* Amazing ! _I_ am already holding the pid file... */
if ((!pid) || (pid == getpid ()))
return 0;
/*
* The 'standard' method of doing this is to try and do a 'fake' kill
* of the process. If an ESRCH error is returned the process cannot
* be found -- GW
*/
/* But... errno is usually changed only on error.. */
if (kill(pid, 0) && errno == ESRCH)
return(0);
return pid;
}
每次运行把pid记录到一个文件里,下次运行做一次kill(pid,0),看看对应的进程是否还存在。
int check_pid (char *pidfile)
{
int pid = read_pid(pidfile);
/* Amazing ! _I_ am already holding the pid file... */
if ((!pid) || (pid == getpid ()))
return 0;
/*
* The 'standard' method of doing this is to try and do a 'fake' kill
* of the process. If an ESRCH error is returned the process cannot
* be found -- GW
*/
/* But... errno is usually changed only on error.. */
if (kill(pid, 0) && errno == ESRCH)
return(0);
return pid;
}
每次运行把pid记录到一个文件里,下次运行做一次kill(pid,0),看看对应的进程是否还存在。
|
怎么不行,你不对异常退出做处理嘛??那当然不行。我觉得共享内存可以,而且很多人都是这么用的。
|
呵呵,很多人用不表示这就是正确的。如果你的进程被SIGKILL杀掉,就没有办法做处理了。
|
用文件锁既简单又可靠,何乐而不为呢?
|
没明白 为什么共享内存在异常退出的时候不行? 我们用的就是共享内存这个不销毁的机制啊
|
程序启动用文件名做个文件 再启动时检查
|
文件锁在进程退出(不管是正常还是异常)时由内核释放,所以再启动另一个实例时不会有问题。共享内存必须由进程自己释放,如果进程异常退出,共享内存无法释放,下一个实例会认为此时有一个应用实例在运行,因而拒绝执行,此时需要用户干预,手工删除该共享内存。
|
实在不行就玩个土一点的,占一个socket端口作服务器端,占不上就表示已经启动了。
当然,前提得保证没有别的程序占这个端口,咳咳。
当然,前提得保证没有别的程序占这个端口,咳咳。
|
我的想法是在共享内存中记录自己的进程信息 这样不但可以管理这个程序
而且可以给自己的一系列程序这样做
判断依据是共享内存区是否存在;若存在是否记录了本程序的已启动记录
而且这样还可以做先前程序崩溃后的恢复工作
这样是否可行?
而且可以给自己的一系列程序这样做
判断依据是共享内存区是否存在;若存在是否记录了本程序的已启动记录
而且这样还可以做先前程序崩溃后的恢复工作
这样是否可行?
|
好像smwu没理解fierygnu(va_list)说的。。。
这块锁是由内核锁上的,程序在应用层,根本没办法再去对他进行二次操作了啊...而且如果是程序异常退出,很多后面问题根本来不及解决啊,可能发生的问题,谁都不知道。而且这 么恢复工作,在应用层实现是根本不可能的!
这块锁是由内核锁上的,程序在应用层,根本没办法再去对他进行二次操作了啊...而且如果是程序异常退出,很多后面问题根本来不及解决啊,可能发生的问题,谁都不知道。而且这 么恢复工作,在应用层实现是根本不可能的!
|
嗨,同志们,需要这么复杂吗?我的想法是:
(1)程序启动完毕一个固定目录下创建一个标志文件
(2)程序启动时,检查标志文件是否存在,如果存在,表明程序已经启动,退出;不存在,正常启动
(3)程序结束时删除标志文件,当然,程序本身能够捕获并处理各个信号。
这个方法比较简单,但如果用户手工创建/删除标志文件,会使得控制失效。具体该如何实现,应根据具体情况斟酌使用。
(1)程序启动完毕一个固定目录下创建一个标志文件
(2)程序启动时,检查标志文件是否存在,如果存在,表明程序已经启动,退出;不存在,正常启动
(3)程序结束时删除标志文件,当然,程序本身能够捕获并处理各个信号。
这个方法比较简单,但如果用户手工创建/删除标志文件,会使得控制失效。具体该如何实现,应根据具体情况斟酌使用。
|
楼上去仔细看了APUE再来回答吧。
|
to HostOOP(碧云黄花) "(3)程序结束时删除标志文件,当然,程序本身能够捕获并处理各个信号。"
-----------如果程序异常退出,则肯定没有删除标志文件,那么"(2)程序启动时,检查标志文件是否存在,如果存在,表明程序已经启动,退出;不存在,正常启动" 就会出问题拉,
赐教:)
-----------如果程序异常退出,则肯定没有删除标志文件,那么"(2)程序启动时,检查标志文件是否存在,如果存在,表明程序已经启动,退出;不存在,正常启动" 就会出问题拉,
赐教:)
|
"如果程序异常退出,则肯定没有删除标志文件"
程序异常退出前,肯定会发出信号,程序应该有捕获信号的功能,并在退出之前做相应操作。
程序异常退出前,肯定会发出信号,程序应该有捕获信号的功能,并在退出之前做相应操作。
|
“程序异常退出前,肯定会发出信号”
自己kill -9 pid试试。
自己kill -9 pid试试。
|
自己kill -9 pid试试。
===================================
我确实考虑不周到,信号SIGKILL和SIGSTOP不能被忽略,也不能被捕捉
===================================
我确实考虑不周到,信号SIGKILL和SIGSTOP不能被忽略,也不能被捕捉
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。