我有一个应用程序,它是一个检测和监视设备的守护程序。它接受参数,然后输出可用的设备。例如
./udevmon -s //prints the devices that are connected to my server.
样本输出
Device: /dev/ttyUSB0 subsystem: tty
现在,当我再次运行它以检查哪些设备可用时,再次键入
./udevmon -s
将创建具有不同进程ID的第二个实例./udevmon。当我键入不带参数的./udevmon时,它将再次创建具有不同进程ID的新实例,因此现在总共有3个./udevmon的进程。随着时间的推移,这将使我的系统变慢,因为我需要多次运行./udevmon。我如何运行我的应用程序,以便它只创建一个实例。例如,当我再次键入./udevmon-s或./udevmon时重新启动它?
这是示例代码。
int main (int argc, char *argv[])
{
mon_init(); // initialize device monitor
scan_init(); // initialize device scan
//Fork the Parent Process
pid = fork();
if (pid < 0) { exit(EXIT_FAILURE); }
//We got a good pid, Close the Parent Process
if (pid > 0) { exit(EXIT_SUCCESS); }
//Change File Mask
umask(0);
//Create a new Signature Id for our child
sid = setsid();
if (sid < 0) { exit(EXIT_FAILURE); }
//Change Directory
//If we cant find the directory we exit with failure.
if ((chdir("/")) < 0) { exit(EXIT_FAILURE); }
while(( c=getopt(argc, argv,"s")) != -1) {
switch(c) {
case 's': scan_run(); break;
default: printf("wrong command\n");
}
}
//Main Process
while(1) {
start_mon();
}
udev_unref(udev);
return 0;
}
最佳答案
请改为在以下包装下运行应用程序:
killall -KILL udevmon &> /dev/null
./udevmon <ARG>
您可以使用下面的脚本轻轻地杀死它,执行与上面相同的操作,并发出一些通知:
#!/bin/bash
exist=`ps -e | grep udevmon | wc -l`
if [ "$exist" == "0" ] ; then
# there is no instance. run it
echo "first run"
./udevmon -s
else
# kill old and run again
pid=`ps -e | grep udevmon | awk '{print $1;}'`
if [ "$pid" != "" ] ; then
kill $pid
echo "kill and run"
./udevmon -s
else
echo "unable to find pid!"
fi
fi