正在显示
5 个修改的文件
包含
102 行增加
和
29 行删除
@@ -19,13 +19,17 @@ chunk_size 60000; | @@ -19,13 +19,17 @@ chunk_size 60000; | ||
19 | # default: ./objs/logs | 19 | # default: ./objs/logs |
20 | ff_log_dir ./objs/logs; | 20 | ff_log_dir ./objs/logs; |
21 | # the log file for srs. | 21 | # the log file for srs. |
22 | -# if not specified, disable log to file, only print to console. | 22 | +# if not specified or empty, disable log to file, only print to console. |
23 | # if speicfied, write log to file and print to console. | 23 | # if speicfied, write log to file and print to console. |
24 | +# default: empty. | ||
24 | srs_log_file ./objs/srs.log; | 25 | srs_log_file ./objs/srs.log; |
25 | # the max connections. | 26 | # the max connections. |
26 | # if exceed the max connections, server will drop the new connection. | 27 | # if exceed the max connections, server will drop the new connection. |
27 | # default: 2000 | 28 | # default: 2000 |
28 | max_connections 1000; | 29 | max_connections 1000; |
30 | +# whether start as deamon | ||
31 | +# default: on | ||
32 | +daemon on; | ||
29 | # vhost list, the __defaultVhost__ is the default vhost | 33 | # vhost list, the __defaultVhost__ is the default vhost |
30 | # for example, user use ip to access the stream: rtmp://192.168.1.2/live/livestream. | 34 | # for example, user use ip to access the stream: rtmp://192.168.1.2/live/livestream. |
31 | # for which cannot identify the required vhost. | 35 | # for which cannot identify the required vhost. |
@@ -71,11 +71,10 @@ start() { | @@ -71,11 +71,10 @@ start() { | ||
71 | srs_log_file=`cat ${ROOT}/${CONFIG} |grep '^srs_log_file'| awk '{print $2}'| awk -F ';' '{print $1}'` | 71 | srs_log_file=`cat ${ROOT}/${CONFIG} |grep '^srs_log_file'| awk '{print $2}'| awk -F ';' '{print $1}'` |
72 | 72 | ||
73 | # TODO: FIXME: set limit by, for instance, "ulimit -HSn 10000" | 73 | # TODO: FIXME: set limit by, for instance, "ulimit -HSn 10000" |
74 | - # TODO: FIXME: support deamon, without nohup. | ||
75 | if [[ -z $srs_log_file ]]; then | 74 | if [[ -z $srs_log_file ]]; then |
76 | - (cd ${ROOT}; nohup ${APP} -c ${CONFIG} >/dev/null 2>&1 &) | 75 | + (cd ${ROOT}; ${APP} -c ${CONFIG} >/dev/null 2>&1) |
77 | else | 76 | else |
78 | - (cd ${ROOT}; nohup ${APP} -c ${CONFIG} >> $srs_log_file 2>&1 &) | 77 | + (cd ${ROOT}; ${APP} -c ${CONFIG} >> $srs_log_file 2>&1) |
79 | fi | 78 | fi |
80 | 79 | ||
81 | # check again after start server | 80 | # check again after start server |
@@ -1282,6 +1282,18 @@ string SrsConfig::get_srs_log_file() | @@ -1282,6 +1282,18 @@ string SrsConfig::get_srs_log_file() | ||
1282 | return conf->arg0(); | 1282 | return conf->arg0(); |
1283 | } | 1283 | } |
1284 | 1284 | ||
1285 | +bool SrsConfig::get_deamon() | ||
1286 | +{ | ||
1287 | + srs_assert(root); | ||
1288 | + | ||
1289 | + SrsConfDirective* conf = root->get("deamon"); | ||
1290 | + if (conf && conf->arg0() == "off") { | ||
1291 | + return false; | ||
1292 | + } | ||
1293 | + | ||
1294 | + return true; | ||
1295 | +} | ||
1296 | + | ||
1285 | int SrsConfig::get_max_connections() | 1297 | int SrsConfig::get_max_connections() |
1286 | { | 1298 | { |
1287 | srs_assert(root); | 1299 | srs_assert(root); |
@@ -149,6 +149,7 @@ public: | @@ -149,6 +149,7 @@ public: | ||
149 | virtual std::string get_engine_output(SrsConfDirective* engine); | 149 | virtual std::string get_engine_output(SrsConfDirective* engine); |
150 | virtual std::string get_ffmpeg_log_dir(); | 150 | virtual std::string get_ffmpeg_log_dir(); |
151 | virtual std::string get_srs_log_file(); | 151 | virtual std::string get_srs_log_file(); |
152 | + virtual bool get_deamon(); | ||
152 | virtual int get_max_connections(); | 153 | virtual int get_max_connections(); |
153 | virtual bool get_gop_cache(std::string vhost); | 154 | virtual bool get_gop_cache(std::string vhost); |
154 | virtual double get_queue_length(std::string vhost); | 155 | virtual double get_queue_length(std::string vhost); |
@@ -37,6 +37,9 @@ SrsServer* _srs_server = new SrsServer(); | @@ -37,6 +37,9 @@ SrsServer* _srs_server = new SrsServer(); | ||
37 | #include <stdlib.h> | 37 | #include <stdlib.h> |
38 | #include <signal.h> | 38 | #include <signal.h> |
39 | 39 | ||
40 | +#include <sys/types.h> | ||
41 | +#include <sys/wait.h> | ||
42 | + | ||
40 | #ifdef SRS_GPERF_MP | 43 | #ifdef SRS_GPERF_MP |
41 | #include <gperftools/heap-profiler.h> | 44 | #include <gperftools/heap-profiler.h> |
42 | #endif | 45 | #endif |
@@ -50,37 +53,13 @@ void handler(int signo) | @@ -50,37 +53,13 @@ void handler(int signo) | ||
50 | _srs_server->on_signal(signo); | 53 | _srs_server->on_signal(signo); |
51 | } | 54 | } |
52 | 55 | ||
53 | -int main(int argc, char** argv) | 56 | +int run_master() |
54 | { | 57 | { |
55 | int ret = ERROR_SUCCESS; | 58 | int ret = ERROR_SUCCESS; |
56 | 59 | ||
57 | - // TODO: support both little and big endian. | ||
58 | - srs_assert(srs_is_little_endian()); | ||
59 | - | ||
60 | -#ifdef SRS_GPERF_MP | ||
61 | - HeapProfilerStart("gperf.srs.gmp"); | ||
62 | -#endif | ||
63 | -#ifdef SRS_GPERF_CP | ||
64 | - ProfilerStart("gperf.srs.gcp"); | ||
65 | -#endif | ||
66 | - | ||
67 | signal(SIGNAL_RELOAD, handler); | 60 | signal(SIGNAL_RELOAD, handler); |
68 | signal(SIGTERM, handler); | 61 | signal(SIGTERM, handler); |
69 | signal(SIGINT, handler); | 62 | signal(SIGINT, handler); |
70 | - | ||
71 | - if ((ret = _srs_config->parse_options(argc, argv)) != ERROR_SUCCESS) { | ||
72 | - return ret; | ||
73 | - } | ||
74 | - | ||
75 | -#ifdef SRS_GPERF_MC | ||
76 | - #ifdef SRS_GPERF_MP | ||
77 | - srs_error("option --with-gmc confict with --with-gmp, " | ||
78 | - "@see: http://google-perftools.googlecode.com/svn/trunk/doc/heap_checker.html\n" | ||
79 | - "Note that since the heap-checker uses the heap-profiling framework internally, " | ||
80 | - "it is not possible to run both the heap-checker and heap profiler at the same time"); | ||
81 | - return -1; | ||
82 | - #endif | ||
83 | -#endif | ||
84 | 63 | ||
85 | srs_trace("uname: "SRS_UNAME); | 64 | srs_trace("uname: "SRS_UNAME); |
86 | srs_trace("build: %s, %s", SRS_BUILD_DATE, srs_is_little_endian()? "little-endian":"big-endian"); | 65 | srs_trace("build: %s, %s", SRS_BUILD_DATE, srs_is_little_endian()? "little-endian":"big-endian"); |
@@ -106,3 +85,81 @@ int main(int argc, char** argv) | @@ -106,3 +85,81 @@ int main(int argc, char** argv) | ||
106 | 85 | ||
107 | return 0; | 86 | return 0; |
108 | } | 87 | } |
88 | + | ||
89 | +int run() | ||
90 | +{ | ||
91 | + // if not deamon, directly run master. | ||
92 | + if (!_srs_config->get_deamon()) { | ||
93 | + return run_master(); | ||
94 | + } | ||
95 | + | ||
96 | + srs_trace("start deamon mode..."); | ||
97 | + | ||
98 | + int pid = fork(); | ||
99 | + | ||
100 | + if(pid == -1){ | ||
101 | + srs_error("create process error. ret=-1"); //ret=0 | ||
102 | + return -1; | ||
103 | + } | ||
104 | + | ||
105 | + // grandpa | ||
106 | + if(pid > 0){ | ||
107 | + int status = 0; | ||
108 | + if(waitpid(pid, &status, 0) == -1){ | ||
109 | + srs_error("wait child process error! ret=-1"); //ret=0 | ||
110 | + } | ||
111 | + srs_trace("grandpa process exit."); | ||
112 | + exit(0); | ||
113 | + return 0; | ||
114 | + } | ||
115 | + | ||
116 | + // father | ||
117 | + pid = fork(); | ||
118 | + | ||
119 | + if(pid == -1){ | ||
120 | + srs_error("create process error. ret=-1"); | ||
121 | + return -1; | ||
122 | + } | ||
123 | + | ||
124 | + if(pid > 0){ | ||
125 | + srs_trace("father process exit. ret=-1"); | ||
126 | + exit(0); | ||
127 | + return 0; | ||
128 | + } | ||
129 | + | ||
130 | + // son | ||
131 | + srs_trace("son(deamon) process running."); | ||
132 | + | ||
133 | + return run_master(); | ||
134 | +} | ||
135 | + | ||
136 | +int main(int argc, char** argv) | ||
137 | +{ | ||
138 | + int ret = ERROR_SUCCESS; | ||
139 | + | ||
140 | + // TODO: support both little and big endian. | ||
141 | + srs_assert(srs_is_little_endian()); | ||
142 | + | ||
143 | +#ifdef SRS_GPERF_MP | ||
144 | + HeapProfilerStart("gperf.srs.gmp"); | ||
145 | +#endif | ||
146 | +#ifdef SRS_GPERF_CP | ||
147 | + ProfilerStart("gperf.srs.gcp"); | ||
148 | +#endif | ||
149 | + | ||
150 | +#ifdef SRS_GPERF_MC | ||
151 | + #ifdef SRS_GPERF_MP | ||
152 | + srs_error("option --with-gmc confict with --with-gmp, " | ||
153 | + "@see: http://google-perftools.googlecode.com/svn/trunk/doc/heap_checker.html\n" | ||
154 | + "Note that since the heap-checker uses the heap-profiling framework internally, " | ||
155 | + "it is not possible to run both the heap-checker and heap profiler at the same time"); | ||
156 | + return -1; | ||
157 | + #endif | ||
158 | +#endif | ||
159 | + | ||
160 | + if ((ret = _srs_config->parse_options(argc, argv)) != ERROR_SUCCESS) { | ||
161 | + return ret; | ||
162 | + } | ||
163 | + | ||
164 | + return run(); | ||
165 | +} |
-
请 注册 或 登录 后发表评论