我编写了一个在标准虚拟托管Linux解决方案上运行的Java服务器应用程序.应用程序一直运行,监听套接字连接并为它们创建新的处理程序.它是客户端 - 服务器应用程序的服务器端实现.
我启动它的方法是将它包含在服务器的启动rc.local脚本中.但是一旦启动,我不知道如何访问它来阻止它,如果我想安装更新,所以我必须重新启动服务器才能重新启动应用程序.
在Windows PC上,对于这种类型的应用程序,我可能会创建一个Windows服务,然后我可以根据需要停止并启动它.Linux盒子上有类似的东西,所以如果我启动这个应用程序,我可以停止它并重新启动它而不需要完全重启服务器.
我的应用程序称为WebServer.exe.它是在服务器启动时启动的,它包含在我的rc.local中:
java -jar /var/www/vhosts/myweb.com/phpserv/WebServer.jar &
Run Code Online (Sandbox Code Playgroud)
我在Linux上有点像菜鸟,所以任何帖子都会受到赞赏.但是我确实有SSH,并且可以通过完整的FTP访问该框以安装任何更新以及访问Plesk面板.
我想要一个可以将任意通用脚本或命令转换为守护进程的守护进程.
我想要处理两种常见情况:
我有一个应该永远运行的脚本.如果它死了(或重启),重新启动它.不要让一次运行两个副本(检测副本是否已经在运行并且在这种情况下不启动它).
我有一个简单的脚本或命令行命令,我希望永远重复执行(运行之间的短暂停顿).同样,不要允许一次运行两个脚本副本.
当然,在案例2中围绕脚本编写"while(true)"循环然后为案例1应用解决方案是微不足道的,但更通用的解决方案将直接解决案例2,因为它适用于案例1中的脚本好(你可能只是想更短或没有停顿如果脚本不打算会死(当然,如果剧本真的没有永远不死,则暂停实际上并不重要)).
请注意,解决方案不应涉及将文件锁定代码或PID记录添加到现有脚本中.
更具体地说,我想要一个程序"daemonize",我可以运行
% daemonize myscript arg1 arg2
Run Code Online (Sandbox Code Playgroud)
或者,例如,
% daemonize 'echo `date` >> /tmp/times.txt'
Run Code Online (Sandbox Code Playgroud)
这将保留越来越多的日期列表附加到times.txt.(注意,如果daemonize的参数是一个永远运行的脚本,如上面的情况1那样,那么daemonize仍然会做正确的事情,必要时重新启动它.)然后我可以在我的.login中输入如上所示的命令和/或每小时或每小时一次(取决于我是多么担心它会意外死亡).
注意:daemonize脚本需要记住它正在守护的命令字符串,这样如果再次守护同一个命令字符串,它就不会启动第二个副本.
此外,理想情况下,该解决方案应该适用于OS X和Linux,但欢迎使用其中一种解决方案.
编辑:如果你必须调用它,这很好sudo daemonize myscript myargs.
(如果我认为这一切都错了,或者有快速和肮脏的局部解决方案,我也很乐意听到.)
PS:如果它有用,这里是一个特定于python的类似问题.
而这个回答类似的问题有什么似乎是一个任意脚本的快速和肮脏的妖魔化一个有用的成语:
每个Java应用程序都将在特定的Java虚拟机实例中运行.我真的对以下方面感到困惑,谷歌搜索让我更加困惑.不同网站上的不同文章.
如果我有一个用java编写的Web服务,它将需要一个JVM实例来运行.那么JVM可以成为一个守护进程吗?
如果是,当我们运行任何其他Java应用程序时,它将使用此JVM实例或创建一个新实例?
任何机器中可用的主存储器都是不变的.当我们同时启动n个java进程而不提供任何初始堆大小时,堆大小如何在进程之间分配?
是否有任何进程可以管理n个JVM实例,还是由操作系统本身管理?
在GC期间发生停止世界时,其他JVM实例(我假设的不同线程)是否受到影响?
我在Java中构建了一个小守护进程,我想在Unix下运行它作为服务(例如Debian 5).我已经读过有可能使用Java包装器,但是没有其他更容易实现的选项吗?我不能只使用Unix等命令xxx java -jar program.jar吗?
我正在使用Solr附带的Jetty/Solr构建,并希望在后台而不是在终端中运行它.
现在我开始它java -jar start.jar但我想它登录到文件并在服务器的后台运行,以便我可以关闭终端窗口.
我确定有一些我找不到的java配置.
我已经尝试过,java -jar start.jar > log.txt &但没有运气仍然输出到终端窗口.
谢谢.
我有一个Java应用程序,我开始使用它
java -jar myapp.jar
要停止它我使用CTRL + C.
现在我需要将该应用程序转换为我可以开始的东西:
/etc/init.d/myapp start
我可以停下来:
/etc/init.d/myapp停止
问题是关于保存过程的PID,我想我在某处看到了这样做的一个方法,我不记得在哪里,我无法找到它.
我看到有一个名为Java Server Wrapper的项目,但我寻找一些不限制内存使用的免费软件.我认为这项工作可以在一个bash脚本中完成.
我想用守护进程运行solr.我在另一篇文章中看到你可以运行一个init.d脚本,但它在我的ubuntu环境中似乎有问题.每当我尝试使用/etc/init.d/solr start运行脚本时,或者当我尝试手动运行以下行时:
daemon java -jar start.jar
Run Code Online (Sandbox Code Playgroud)
它的错误:
daemon: invalid option -- 'j'
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?谢谢.