当前位置: 技术问答>linux和unix
linux 下如何实现控制所有应用程序为单实例的????
来源: 互联网 发布时间:2016-09-02
本文导语: 现在因为 系统资源有限,所以限制 linux 系统中所有应用程序为单个实例,比如说,firefox 已经启动了,那么再单击它就不会启动第二个firfox,其他的一样,大家有什么好的办法?? 如果是自己的写的程序很容易实...
现在因为 系统资源有限,所以限制 linux 系统中所有应用程序为单个实例,比如说,firefox 已经启动了,那么再单击它就不会启动第二个firfox,其他的一样,大家有什么好的办法??
如果是自己的写的程序很容易实现这个功能,但是如何控制其他程序呢??
如果是自己的写的程序很容易实现这个功能,但是如何控制其他程序呢??
|
能否这样子,在启动某个程序的时候先判断该程序名是否在 ps -ef出来的结果中,如果在这个列表中就不启动
|
ps -ax | grep firefox
查看进程是否已经存在,来确定是否再启动。
可以用 popen("ps -ax | grep firefox ") 再处理返回值。
查看进程是否已经存在,来确定是否再启动。
可以用 popen("ps -ax | grep firefox ") 再处理返回值。
|
这实际上由三个子问题组成:应用程序单实例运行、自动把窗口提到前面和把参数传递给第一个运行实例。对此我们考虑了下列方法:
方法一:遍历
/proc目录下的进程信息,如果应用程序对应的进程存在,则让认为应用程序已经在运行。然后强制关闭该应用程序,用新的命令行参数重新运行它。这样做的优点是实现简单,到达了我们预期的目标。缺点是强制kill第一个运行实例太野蛮,可能会造成数据丢失,另外创建新进程的开销会让用户感觉反应迟钝。
方法二:通过窗口管理器实现,根据应用程序的窗口判断应用程序是否在运行。如果发现对应的应用程序已经在运行,把对应的窗口提到前面来。这要修改应用程序才行,只有应用程序自己才知道其拥有的窗口的关系,若不加考虑把应用程序的主窗口提到前面来,这也并不见得合适。这种方法只能解决前两个小问题,命令行参数还是无法传递给第一个运行实例。
方法三:应用程序提供一个DBUS服务对象,第一个运行实例作为服务器运行,第二个运行实例作为客户端运行,第二个运行实例把命令行参数传递给第一个运行实例,然后就退出。第一个运行实例接受到新的命令行参数,作相应的处理,比如,把相应的窗口提到前面来,根据命令行参数进行处理。这是第二种方法的改进,可以实现全部的功能,缺点是要修改应用程序,不过DBUS服务对象可以通过一个公共库来实现,应用程序的改动并不大。
http://www.wangchao.net.cn/bbsdetail_557603.html
方法一:遍历
/proc目录下的进程信息,如果应用程序对应的进程存在,则让认为应用程序已经在运行。然后强制关闭该应用程序,用新的命令行参数重新运行它。这样做的优点是实现简单,到达了我们预期的目标。缺点是强制kill第一个运行实例太野蛮,可能会造成数据丢失,另外创建新进程的开销会让用户感觉反应迟钝。
方法二:通过窗口管理器实现,根据应用程序的窗口判断应用程序是否在运行。如果发现对应的应用程序已经在运行,把对应的窗口提到前面来。这要修改应用程序才行,只有应用程序自己才知道其拥有的窗口的关系,若不加考虑把应用程序的主窗口提到前面来,这也并不见得合适。这种方法只能解决前两个小问题,命令行参数还是无法传递给第一个运行实例。
方法三:应用程序提供一个DBUS服务对象,第一个运行实例作为服务器运行,第二个运行实例作为客户端运行,第二个运行实例把命令行参数传递给第一个运行实例,然后就退出。第一个运行实例接受到新的命令行参数,作相应的处理,比如,把相应的窗口提到前面来,根据命令行参数进行处理。这是第二种方法的改进,可以实现全部的功能,缺点是要修改应用程序,不过DBUS服务对象可以通过一个公共库来实现,应用程序的改动并不大。
http://www.wangchao.net.cn/bbsdetail_557603.html
|
写个后台运行的监控程序,
不断判断所有的进程,
看是否有重复。
如果有,而且不是必要的,
就用pkill或killall来杀掉。
要kill掉的是PID较大的那个,
因为这个是后来执行的。
ps -e可以显示所有进程,
不管是哪个shell开启的。
好像 -ax也是,你可以去试试。
实现很简单。
不断判断所有的进程,
看是否有重复。
如果有,而且不是必要的,
就用pkill或killall来杀掉。
要kill掉的是PID较大的那个,
因为这个是后来执行的。
ps -e可以显示所有进程,
不管是哪个shell开启的。
好像 -ax也是,你可以去试试。
实现很简单。
|
在别的程序的启动脚本里添加一句判断就行了
如果该进程ID存在 就直接exit 1就行了 并输出该程序运行中
如果该进程ID存在 就直接exit 1就行了 并输出该程序运行中
|
一个进程启动后把它的pid保存在文件中,再次启动时判断这个pid在后台程序中是否存在
|
需要在程序里加互斥锁。
|
以前有篇帖子,讨论的不错,楼主参考吧!
能实现的方式还是比较多的。
http://topic.csdn.net/u/20080616/10/77b33ebd-cad4-4dda-8f35-8246e6f1959a.html
能实现的方式还是比较多的。
http://topic.csdn.net/u/20080616/10/77b33ebd-cad4-4dda-8f35-8246e6f1959a.html
|
这种写入文件的方式还是有错的,如果在磁盘满的情况下是会失败的