如何在Linux上启动一个服务?

23 浏览
0 Comments

如何在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面板。

0
0 Comments

在Linux上启动服务的方法是将服务的初始化脚本存储在/etc/init.d目录中。可以复制并自定义/etc/init.d/skeleton文件,然后调用service [yourservice] start|stop|restart命令来启动、停止或重启服务。详细信息请参考http://www.ralfebert.de/blog/java/debian_daemon/。这个链接是针对Debian(也适用于Ubuntu)的,但适用于更多的Linux发行版。看起来很有希望。我将仔细研究一下。谢谢。

0
0 Comments

问题出现的原因:作者想在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),则这些钩子将不会执行。此外,操作系统可能会在关闭钩子执行时间过长时中断它们,因此请确保关闭钩子的执行时间尽可能短暂。

希望这个解决方案对您有所帮助!

0
0 Comments

如何在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程序的设置。用户可以根据需要进行配置。

希望以上内容能对您有所帮助。

0