如何在Linux上启动一个服务?
如何在Linux上启动一个服务?
我编写了一个Java服务器应用程序,运行在一个标准的虚拟托管Linux解决方案上。该应用程序始终运行,监听套接字连接并为其创建新的处理程序。它是一个客户端-服务器应用程序的服务器端实现。
我通过将其包含在服务器的启动rc.local脚本中来启动它。然而,一旦启动,我不知道如何访问它以停止它,如果我想安装更新,我必须重新启动服务器以重新启动应用程序。
在Windows PC上,对于这种类型的应用程序,我可能会创建一个Windows服务,然后我可以根据需要停止和启动它。在Linux系统中是否有类似的东西,以便如果我启动这个应用程序,我可以在不完全重新启动服务器的情况下停止和重新启动它。
我的应用程序名为WebServer.exe。它在服务器启动时通过将其包含在我的rc.local中启动,如下所示:
java -jar /var/www/vhosts/myweb.com/phpserv/WebServer.jar &
我对Linux不太熟悉,所以任何示例都将受到欢迎。但是我有SSH和完全的FTP访问权限来安装任何更新,以及访问Plesk面板。
在Linux上启动服务的方法是将服务的初始化脚本存储在/etc/init.d
目录中。可以复制并自定义/etc/init.d/skeleton
文件,然后调用service [yourservice] start|stop|restart
命令来启动、停止或重启服务。详细信息请参考http://www.ralfebert.de/blog/java/debian_daemon/。这个链接是针对Debian(也适用于Ubuntu)的,但适用于更多的Linux发行版。看起来很有希望。我将仔细研究一下。谢谢。
问题出现的原因:作者想在Linux上启动一个服务,并且希望在程序退出之前所有正在运行的线程都能完成。
解决方法:创建一个名为start.sh的脚本文件,通过nohup运行Java程序,并将进程ID保存到一个文件中。停止脚本stop.sh从文件中读取进程ID并杀死应用程序。使用kill命令会发送TERM信号,这将调用任何已经设置的关闭钩子,因此可以使用它们来优雅地结束进程。
以下是整理后的文章:
为了在Linux上启动一个服务并确保所有线程都能完成,有一个简单的解决方案。可以创建一个名为start.sh的脚本文件,通过nohup运行Java程序,并将进程ID保存到一个文件中。停止脚本stop.sh从文件中读取进程ID并杀死应用程序。
下面是一个示例脚本start.sh的代码:
nohup java -jar myapplication.jar > log.txt 2> errors.txt < /dev/null & PID=$! echo $PID > pid.txt
这个脚本首先使用nohup运行Java程序,并将输出重定向到log.txt和errors.txt文件中。然后,将进程ID保存到pid.txt文件中。
接下来,我们需要一个停止脚本stop.sh来停止服务。脚本会读取pid.txt文件中的进程ID,并使用kill命令杀死应用程序。
以下是一个示例脚本stop.sh的代码:
PID=$(cat pid.txt) kill $PID
需要注意的是,这些示例代码中省略了一些细节,例如检查进程是否存在以及在完成后删除pid.txt文件。
然而,有一个问题需要注意:使用kill命令会发送TERM信号,这将调用任何已经设置的关闭钩子。因此,在程序退出之前,可以使用这些钩子来确保所有线程都能完成。然而,如果进程收到kill信号(例如kill -9),则这些钩子将不会执行。此外,操作系统可能会在关闭钩子执行时间过长时中断它们,因此请确保关闭钩子的执行时间尽可能短暂。
希望这个解决方案对您有所帮助!
如何在Linux上启动一个服务?
问题出现的原因:用户想要知道如何在Linux上启动一个服务。
解决方法:用户可以按照以下步骤进行操作。
1. 首先,用户可以编写一个简单的包装脚本,如下所示:
#!/bin/sh SERVICE_NAME=MyService PATH_TO_JAR=/usr/local/MyProject/MyJar.jar PID_PATH_NAME=/tmp/MyService-pid case $1 in start) echo "Starting $SERVICE_NAME ..." if [ ! -f $PID_PATH_NAME ]; then nohup java -jar $PATH_TO_JAR /tmp 2>> /dev/null >> /dev/null & echo $! > $PID_PATH_NAME echo "$SERVICE_NAME started ..." else echo "$SERVICE_NAME is already running ..." fi ;; stop) if [ -f $PID_PATH_NAME ]; then PID=$(cat $PID_PATH_NAME); echo "$SERVICE_NAME stopping ..." kill $PID; echo "$SERVICE_NAME stopped ..." rm $PID_PATH_NAME else echo "$SERVICE_NAME is not running ..." fi ;; restart) if [ -f $PID_PATH_NAME ]; then PID=$(cat $PID_PATH_NAME); echo "$SERVICE_NAME stopping ..."; kill $PID; echo "$SERVICE_NAME stopped ..."; rm $PID_PATH_NAME echo "$SERVICE_NAME starting ..." nohup java -jar $PATH_TO_JAR /tmp 2>> /dev/null >> /dev/null & echo $! > $PID_PATH_NAME echo "$SERVICE_NAME started ..." else echo "$SERVICE_NAME is not running ..." fi ;; esac
2. 用户可以按照以下链接中的教程来编写init.d脚本:here,以及systemd脚本(适用于ubuntu 16+):here
3. 如果需要输出日志文件,用户可以将以下代码行
nohup java -jar $PATH_TO_JAR /tmp 2>> /dev/null >> /dev/null &
替换为
nohup java -jar $PATH_TO_JAR >> myService.out 2>&1 &
4. 对于基于Debian的发行版,如Debian和Ubuntu,用户可以将脚本添加到/etc/init.d目录中。然后可以通过运行命令/etc/init.d/MyService start来启动服务。用户也可以通过运行命令update-rc.d MyService defaults来设置自动启动。
5. 对于CentOS,用户可以尝试使用类似的方法将脚本添加到/etc/init.d目录中。
6. 如果用户想要添加一个状态查询,以返回服务是否正在运行或停止等信息,可以根据具体情况进行相应的修改。
7. 如果用户担心使用kill命令无法让Java程序正常关闭,可以根据Java程序的具体情况来处理。可以参考stackoverflow上的相关问题:stackoverflow.com/questions/2541597/...。建议删除MyService-pid文件而不是使用kill命令,并在Java部分中添加一个守护线程来检查文件是否存在。
8. 输出文件(日志)的位置取决于Java程序的设置。用户可以根据需要进行配置。
希望以上内容能对您有所帮助。