Edit: oh yes, maybe you use Arc 3! The current version is Arc 3.1: see the previous link. Direct download: http://ycombinator.com/arc/arc3.1.tar. The patch is to be used with the 3.1!
> To be honest, a web service without daemonizing does not sound very intuitive. When I say I need to stay connected to the server to keep the service alive, forums users say "Ah man, what kind of a computer engineer are you?"
I agree it's not intuitive, but the use of `screen' + long-lived REPL to manage the forum can actually be seen as quite smart:
$ screen arc
arc> (load "news.arc")
arc> (thread:nsv) ; start it in a new thread, to not block the REPL
arc> ^A d ; CTRL-A d, to detach the `screen'
[detached]
Your forum is started and your screen session detached. You can safely logout and exit your SSH session at this point.
At any time, you can login back to the server and do:
$ screen -r # resume
arc> ; you're in front of the forum REPL
arc> requests* ; ultra basic analytics: show the number of requests served
161803
arc> (change-some-settings) ; you get the idea
And if you need to stop the server and exit Arc:
arc> (exit) ; or just ^D if you have applied the patch
[screen is terminating]
$
One thing that is missing is there is no watchdog, no automatic restart in case of failure (I mean big failure, like: the Arc process died). Sure, it's not as solid as the daemontools (http://cr.yp.to/daemontools.html), but it should suffice. srv.arc has some kind of protection against flood, handler threads that would get mad, etc.
If you really want to just echo '(nsv)' | arc news.arc -, then use version 3.1, the patch and a small shell or Perl wrapper script to daemonize the Arc process. Some fork + redirect standard ports + setsid magic, then exec the Arc process.
In Perl, from `perldoc perlipc':
use POSIX 'setsid';
sub daemonize {
# chdir '/' or die "Can't chdir to /: $!";
open STDIN, '/dev/null' or die "Can't read /dev/null: $!";
open STDOUT, '>/dev/null'
or die "Can't write to /dev/null: $!";
defined(my $pid = fork) or die "Can't fork: $!";
exit if $pid;
setsid or die "Can't start a new session: $!";
open STDERR, '>&STDOUT' or die "Can't dup stdout: $!";
}
Thanks, I got it working. For reference, particularly your screen trick worked very well over ssh. -L option also helps if screen dies on you, it creates a log file in the current dir that you can check and see what went wrong.
Next, I believe I need to learn a bit of arc to see how I can make changes on the website.