linux - 服务器启动脚本问题

标签 linux bash minecraft gnu-screen

我正在尝试设置 Minecraft 服务器。然而,提供的基本启动脚本不符合我的需求。我想要一个脚本,它将:

  • 启动一个新的 screen 运行 jarfile 和(几乎) jarfile(这样我可以在需要时 ^C 它而不杀死 screen 或我的 gzip 命令等其他东西)
  • Gzip 未由 jar 文件自动 gzip 压缩的任何日志(如果/当我^C'ed 服务器时,或者服务器崩溃时)
  • 使用 sudo 运行命令,将第一个参数中的进程设置为高优先级 (/usr/bin/oom-priority)
  • 在不同 screen resource-pack目录上运行http-server,并在服务器关闭时向其发送^C
<小时/>

我有这三个命令。我运行 startserver 来启动服务器。

启动服务器:

#!/bin/bash
set -m

cd /home/minecraftuser/server/

echo
screen -dm -S http-server http-server ./resource-pack
screen -dm -S my-mc-server startserver_command
(sleep 1; startserver_after) &
screen -S my-mc-server

startserver_command:

#!/bin/bash
set -m

cd /home/minecraftuser/server/

echo
java -Xmx768M -Xms768M -jar ./craftbukkit.jar $@ &
env MC_PID=$! > /dev/null
(sleep 0.5; sudo /usr/bin/oom-priority $MC_PID) &
fg 1

echo
read -n 1 -p 'Press any key to continue...'

startserver_after:

#!/bin/bash

cd /home/minecraftuser/server/

wait $MC_PID


find /home/minecraftuser/server/logs -type f -name "*.log" -print | while read file; do gzip $file &
done

screen -S http-server -p 0 -X stuff \^c\\r
<小时/>

编辑:当我运行startserver时,我会收到一个命令提示符,然后出现一堆已存在的gzip文件错误(我期待这些错误,但是当我运行startserver时,我应该得到java程序)。不知何故,我处于一个 screen 中,因为当我执行^A d时,我会看到一个新的提示。 一旦我离开 screen ,screen -ls 就会返回 my-mc-server 的两个实例。一种是空白的命令提示符,另一种是服务器运行成功。

编辑 2: 我更改了 startserver_command 以从 env MC_PID=$! 中删除星号! & (那里不需要)并将其添加到 (sleep 1; startserver_after) (使其更快),将 env 行重定向到 /dev/null (删除输出开头的整个环境列表)。仍然没有解决整个问题。

最佳答案

您可以使用自定义的 .screenrc 来指定一些启动窗口(并运行命令/脚本),而不是从脚本启动每个 screen session :

#$HOME/mc-server.screenrc
screen -t http-server 0 'startserver'
screen -t my-mc-server 1 'startserver_command'
screen -t gzip-logs 2 'startserver_after'

然后只需启动 screen (指定要使用的配置文件,如果它不是默认的 ~/.screenrc)

screen -dm -c mc-server.screenrc

关于linux - 服务器启动脚本问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23875425/

相关文章:

linux - 上传文件到busybox机器

Python 解析 Minecraft 数据包

java - 将Thaumcraft添加为依赖项-Minecraft 1.12.2 retrofit

linux - 在 Debian Wheezy Web 服务器上禁用文件缓存

php - 从 50,000 多个文件 NFS 挂载目录中检索目录树的更好方法

linux 命令 "tail -f filename"不起作用

python - 如何在 Ubuntu 中的 python 脚本中按卷标访问驱动器

bash - 提取每个 ID 的主要号码和次要号码并生成 JSON 字符串

ruby - 在 ruby​​ 脚本中的命令

java - 如何在 Forge 中获取 MinecraftServer 的实例?