1 // This file is written in D programming language
2 /**
3 * The example shows how to send signals to daemons created by
4 * daemonize.
5 *
6 * Copyright: © 2014 Anton Gushcha
7 * License: Subject to the terms of the MIT license, as written in the included LICENSE file.
8 * Authors: NCrashed <ncrashed@gmail.com>
9 */
10 module example02;
11
12 static if( __VERSION__ < 2075) import std.datetime;
13 else import core.time;
14
15 import daemonize.d;
16
17 // Describing custom signals
18 enum RotateLogSignal = "RotateLog".customSignal;
19 enum DoSomethingSignal = "DoSomething".customSignal;
20
21 version(DaemonServer)
22 {
23 // Full description for daemon side
24 alias daemon = Daemon!(
25 "DaemonizeExample2",
26
27 KeyValueList!(
28 Composition!(Signal.Terminate, Signal.Quit, Signal.Shutdown, Signal.Stop), (logger)
29 {
30 logger.logInfo("Exiting...");
31 return false;
32 },
33 Signal.HangUp, (logger)
34 {
35 logger.logInfo("Hello World!");
36 return true;
37 },
38 RotateLogSignal, (logger)
39 {
40 logger.logInfo("Rotating log!");
41 logger.reload;
42 return true;
43 },
44 DoSomethingSignal, (logger)
45 {
46 logger.logInfo("Doing something...");
47 return true;
48 }
49 ),
50
51 (logger, shouldExit)
52 {
53 // will stop the daemon in 5 minutes
54 static if( __VERSION__ < 2075 )
55 {
56 auto time = Clock.currSystemTick + cast(TickDuration)5.dur!"minutes";
57 alias currTime = Clock.currSystemTick;
58 }
59 else
60 {
61 auto time = MonoTime.currTime + 5.dur!"minutes";
62 alias currTime = MonoTime.currTime;
63 }
64 while(!shouldExit() && time > currTime) { }
65 logger.logInfo("Exiting main function!");
66
67 return 0;
68 }
69 );
70
71 int main()
72 {
73 // For windows is important to use absolute path for logging
74 version(Windows) string logFilePath = "C:\\logfile.log";
75 else string logFilePath = "logfile.log";
76
77 auto logger = new shared DloggLogger(logFilePath);
78 return buildDaemon!daemon.run(logger);
79 }
80 }
81 version(DaemonClient)
82 {
83 import core.thread;
84 import core.time;
85
86 // For client you don't need full description of the daemon
87 // the truncated description consists only of name and a list of
88 // supported signals
89 alias client = DaemonClient!(
90 "DaemonizeExample2",
91 Composition!(Signal.Terminate, Signal.Quit, Signal.Shutdown, Signal.Stop),
92 Signal.HangUp,
93 RotateLogSignal,
94 DoSomethingSignal
95 );
96
97 void main()
98 {
99 auto logger = new shared DloggLogger("client.log");
100
101 alias daemon = buildDaemon!client;
102 alias send = daemon.sendSignal;
103 alias uninstall = daemon.uninstall;
104
105 send(logger, Signal.HangUp);
106 Thread.sleep(50.dur!"msecs");
107 send(logger, RotateLogSignal);
108 Thread.sleep(50.dur!"msecs");
109 send(logger, DoSomethingSignal);
110 Thread.sleep(50.dur!"msecs");
111 send(logger, Signal.Terminate);
112
113 // For windows services are remain in SC manager until uninstalled manually
114 version(Windows)
115 {
116 Thread.sleep(500.dur!"msecs");
117 uninstall(logger);
118 }
119 }
120 }