arohner / lein-daemon Goto Github PK
View Code? Open in Web Editor NEWA leiningen plugin for daemonizing a clojure process
A leiningen plugin for daemonizing a clojure process
java.lang.ExceptionInInitializerError
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:532)
at java.lang.Class.newInstance0(Class.java:372)
at java.lang.Class.newInstance(Class.java:325)
at org.apache.commons.daemon.support.DaemonLoader.load(DaemonLoader.java:139)
Caused by: java.lang.IllegalArgumentException: No matching method: with_bindings (daemonProxy.clj:27)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:5376)
at clojure.lang.Compiler.analyze(Compiler.java:5190)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:5357)
at clojure.lang.Compiler.analyze(Compiler.java:5190)
at clojure.lang.Compiler.analyze(Compiler.java:5151)
at clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java:4670)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:5369)
at clojure.lang.Compiler.analyze(Compiler.java:5190)
at clojure.lang.Compiler.analyze(Compiler.java:5151)
at clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java:4670)
at clojure.lang.Compiler$LetExpr$Parser.parse(Compiler.java:4941)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:5369)
at clojure.lang.Compiler.analyze(Compiler.java:5190)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:5357)
at clojure.lang.Compiler.analyze(Compiler.java:5190)
at clojure.lang.Compiler.analyze(Compiler.java:5151)
at clojure.lang.Compiler$IfExpr$Parser.parse(Compiler.java:2315)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:5369)
at clojure.lang.Compiler.analyze(Compiler.java:5190)
at clojure.lang.Compiler.analyze(Compiler.java:5151)
at clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java:4670)
at clojure.lang.Compiler$LetExpr$Parser.parse(Compiler.java:4941)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:5369)
at clojure.lang.Compiler.analyze(Compiler.java:5190)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:5357)
at clojure.lang.Compiler.analyze(Compiler.java:5190)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:5357)
at clojure.lang.Compiler.analyze(Compiler.java:5190)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:5357)
at clojure.lang.Compiler.analyze(Compiler.java:5190)
at clojure.lang.Compiler.analyze(Compiler.java:5151)
at clojure.lang.Compiler$IfExpr$Parser.parse(Compiler.java:2315)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:5369)
at clojure.lang.Compiler.analyze(Compiler.java:5190)
at clojure.lang.Compiler.analyze(Compiler.java:5151)
at clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java:4670)
at clojure.lang.Compiler$LetExpr$Parser.parse(Compiler.java:4941)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:5369)
at clojure.lang.Compiler.analyze(Compiler.java:5190)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:5357)
at clojure.lang.Compiler.analyze(Compiler.java:5190)
at clojure.lang.Compiler.analyze(Compiler.java:5151)
at clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java:4670)
at clojure.lang.Compiler$FnMethod.parse(Compiler.java:4328)
at clojure.lang.Compiler$FnExpr.parse(Compiler.java:3173)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:5367)
at clojure.lang.Compiler.analyze(Compiler.java:5190)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:5357)
at clojure.lang.Compiler.analyze(Compiler.java:5190)
at clojure.lang.Compiler.analyze(Compiler.java:5151)
at clojure.lang.Compiler$HostExpr$Parser.parse(Compiler.java:798)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:5369)
at clojure.lang.Compiler.analyze(Compiler.java:5190)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:5357)
at clojure.lang.Compiler.analyze(Compiler.java:5190)
at clojure.lang.Compiler.access$100(Compiler.java:35)
at clojure.lang.Compiler$DefExpr$Parser.parse(Compiler.java:438)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:5369)
at clojure.lang.Compiler.analyze(Compiler.java:5190)
at clojure.lang.Compiler.analyze(Compiler.java:5151)
at clojure.lang.Compiler.eval(Compiler.java:5428)
at clojure.lang.Compiler.load(Compiler.java:5857)
at clojure.lang.RT.loadResourceScript(RT.java:340)
at clojure.lang.RT.loadResourceScript(RT.java:331)
at clojure.lang.RT.load(RT.java:409)
at clojure.lang.RT.load(RT.java:381)
at clojure.core$load$fn__4511.invoke(core.clj:4905)
at clojure.core$load.doInvoke(core.clj:4904)
at clojure.lang.RestFn.invoke(RestFn.java:409)
at clojure.lang.Var.invoke(Var.java:365)
at leiningen.daemon.daemonProxy.(Unknown Source)
... 7 more
Caused by: java.lang.IllegalArgumentException: No matching method: with_bindings
at clojure.lang.Compiler$StaticMethodExpr.(Compiler.java:1349)
at clojure.lang.Compiler$HostExpr$Parser.parse(Compiler.java:832)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:5369)
... 77 more
Cannot load daemon
Service exit with a return value of 3
See my note on pull request #12 :
The log file is still created with a leading : on it. This line should call name
on alias
I think: https://github.com/arohner/lein-daemon/blob/master/src/leiningen/daemon.clj#L63
The do-start
function does not have the args passed to it from start-main
so any additional arguments are ignored.
I was using keywords previously but when I upgraded to 0.5.1, I got a null pointer on the (symbol (:ns info))
call because passing :foo
as the daemon name seemed to just create a ":foo"
string which failed to match on the get-in
call that gets the daemon info from the project.
When I changed to using strings in the :daemon
map and passing foo
as the daemon name, everything worked fine.
The readme is a bit confusing on this since it shows keywords in the :daemon
map but also shows lein daemon start foo
(not a keyword) later on. For me, the latter did not work when the :daemon
map contained keywords.
Not sure whether this is a bug or a documentation issue?
If you configure your pidfile to be located anywhere outside of the project directory (for instance, /tmp/app.pid), the startup script will hang indefinitely waiting for the pidfile to appear, even though the pidfile has been created correctly.
When project.clj defines :main
its value could be used as an implicit default configuration. It would remove the need for the :daemon
configuration for simple project.
Also it could be manipulated without key e.g. lein daemon start
What do you think?
Any reason there isn't a restart task? Would you object to a PR?
Ahoy!
I'm a hapless operations guy tinkering with Clojure. As an Ops guy lein-daemon is the bee's knees!
I'm working on a learning project here and I am getting the following when I try to daemonize my leiningen project:
nathan@sputnik:~/repos/crybaby$ lein daemon start :crybaby
Exception in thread "main" java.lang.NumberFormatException: For input string: "" (NO_SOURCE_FILE:0)
at clojure.lang.Compiler.eval(Compiler.java:5441)
at clojure.lang.Compiler.eval(Compiler.java:5392)
at clojure.core$eval.invoke(core.clj:2382)
at clojure.main$eval_opt.invoke(main.clj:235)
at clojure.main$initialize.invoke(main.clj:254)
at clojure.main$script_opt.invoke(main.clj:270)
at clojure.main$main.doInvoke(main.clj:354)
at clojure.lang.RestFn.invoke(RestFn.java:512)
at clojure.lang.Var.invoke(Var.java:385)
at clojure.lang.AFn.applyToHelper(AFn.java:185)
at clojure.lang.Var.applyTo(Var.java:482)
at clojure.main.main(main.java:37)
Caused by: java.lang.NumberFormatException: For input string: ""
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:493)
at java.lang.Integer.parseInt(Integer.java:514)
at leiningen.daemon_runtime$get_pid.invoke(daemon_runtime.clj:78)
at leiningen.daemon$pid_present_QMARK_.invoke(daemon.clj:26)
at leiningen.daemon$start_main.doInvoke(daemon.clj:40)
at clojure.lang.RestFn.invoke(RestFn.java:425)
at clojure.lang.AFn.applyToHelper(AFn.java:163)
at clojure.lang.RestFn.applyTo(RestFn.java:132)
at clojure.core$apply.invoke(core.clj:544)
at leiningen.daemon$daemon.doInvoke(daemon.clj:120)
at clojure.lang.RestFn.invoke(RestFn.java:439)
at clojure.lang.Var.invoke(Var.java:373)
at clojure.lang.AFn.applyToHelper(AFn.java:167)
at clojure.lang.Var.applyTo(Var.java:482)
at clojure.core$apply.invoke(core.clj:542)
at leiningen.core$apply_task.invoke(core.clj:262)
at leiningen.core$_main.doInvoke(core.clj:329)
at clojure.lang.RestFn.applyTo(RestFn.java:139)
at clojure.core$apply.invoke(core.clj:542)
at leiningen.core$_main.invoke(core.clj:332)
at user$eval42.invoke(NO_SOURCE_FILE:1)
at clojure.lang.Compiler.eval(Compiler.java:5425)
... 11 more
I have in my project.clj:
:dev-dependencies [[lein-daemon "0.4.0"]]
and
:daemon {:crybaby {:ns crybaby.core
:pidfile "run/crybaby.pid"}}
I am working in Ubuntu 12.04, Clojure 1.4.0 and Leiningen 1.7.1 on Java 1.6.0_24 OpenJDK 64-Bit Server VM.
I must be overlooking some mundane detail, but I haven't quite gotten the knack for parsing Clojure stack traces...
Have you any thoughts?
https://github.com/arohner/lein-daemon/blob/master/src/leiningen/daemon_starter.clj#L12
The value of alias in the above line is not keyword, but string.
So retrieving daemon map always fail.
% cat :http.log
java.lang.NullPointerException
at clojure.lang.Symbol.intern(Symbol.java:60)
at clojure.core$symbol.invoke(core.clj:523)
at leiningen.daemon_starter$daemon_starter.doInvoke(daemon_starter.clj:13)
at clojure.lang.RestFn.invoke(RestFn.java:423)
at clojure.lang.Var.invoke(Var.java:419)
at clojure.lang.AFn.applyToHelper(AFn.java:163)
at clojure.lang.Var.applyTo(Var.java:532)
at clojure.core$apply.invoke(core.clj:603)
at leiningen.core.main$resolve_task$fn__1606.doInvoke(main.clj:132)
at clojure.lang.RestFn.applyTo(RestFn.java:139)
at clojure.lang.AFunction$1.doInvoke(AFunction.java:29)
at clojure.lang.RestFn.applyTo(RestFn.java:137)
at clojure.core$apply.invoke(core.clj:603)
at leiningen.core.main$apply_task.invoke(main.clj:167)
at leiningen.core.main$_main$fn__1665.invoke(main.clj:237)
at leiningen.core.main$_main.doInvoke(main.clj:221)
at clojure.lang.RestFn.invoke(RestFn.java:421)
at clojure.lang.Var.invoke(Var.java:419)
at clojure.lang.AFn.applyToHelper(AFn.java:163)
at clojure.lang.Var.applyTo(Var.java:532)
at clojure.core$apply.invoke(core.clj:601)
at clojure.main$main_opt.invoke(main.clj:324)
at clojure.main$main.doInvoke(main.clj:427)
at clojure.lang.RestFn.invoke(RestFn.java:457)
at clojure.lang.Var.invoke(Var.java:427)
at clojure.lang.AFn.applyToHelper(AFn.java:172)
at clojure.lang.Var.applyTo(Var.java:532)
at clojure.main.main(main.java:37)
Right now it's set to 5 minutes, but I have a project that is timing out. I've noticed that lein trampoline
can take awhile compared to lein run
in my case. If this could be a setting specified in :daemon
in project.clj it would be helpful as I could extend it. Also those who want a shorter timeout can do that too.
As a workaround for anyone having timeout issues, you can run nohup bash -c "lein trampoline run"
, but you'll need to kill it off manually.
I don't want to put my source code on server, is it possible to put the lein daemon logic in the -main method?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.