Linux 找不到由 PHP 启动的进程
Linux can't find process started by PHP
我目前正在 运行 自己的 Minecraft 服务器,我想构建一个选项来通过 PHP 重启 Minecraft 服务器,这样我的朋友就可以在不需要访问权限的情况下重启 MC 服务器到我的实际服务器。
因此,首先我想创建一个脚本来启动服务器:
startup.php
<?php
chdir('/home/minecraft/minecraft_server/');
exec("./start");
?>
开始
screen -mdS "minecraft_up" java -Xmx4G -Xms4G -jar server.jar nogui
经过一些权限问题等,通过调用 webadress 可以启动服务器。
现在,我的问题是我无法访问屏幕进程。
当运行宁ps -ef
我得到:
UID PID PPID C TTY TIME CMD
www-data 29642 1 0 ? 00:00:00 SCREEN -mdS minecraft_up jav
www-data 29643 29642 99 pts/5 00:02:07 java -Xmx4G -Xms4G -jar serv
当运行宁sudo pwdx 29642
获取进程位置时我得到:
29642: /home/minecraft/minecraft_server
但是当我进入 /home/minecraft/minecraft_server
目录并 运行 screen -ls
或 sudo screen -ls
时,两次我都得到:
No Sockets found in /run/screen/S-minecraft.
对比:在终端中手动执行start文件时,当运行ning screen -ls
时其实可以看到进程(或者用screen -r
打开):
There is a screen on:
29025.minecraft_up (01/24/2021 01:32:45 PM) (Detached)
1 Socket in /run/screen/S-minecraft.
我也得到了相同的工作目录,但我无法在进程启动时手动 运行 启动文件 py PHP 仍然是 运行ning.
我真的不是Linux方面的专家,我猜是有一些用户权限干扰或者PHP被当作自己的用户,我真的不知道,这就是我问的原因。
如何访问由 PHP 启动的这个进程?
要使用 systemd
创建服务:
在 /etc/systemd/system/
中创建一个名为 minecraft-server.service
的文件,内容如下:
[Unit]
Description=Minecraft server
After=network.target
StartLimitIntervalSec=0
[Service]
Type=simple
Restart=always
RestartSec=1
User=minecraft
Group=appmgr
ExecStart=java -Xmx4G -Xms4G -jar server.jar
[Install]
WantedBy=multi-user.target
用完整路径替换 server.jar
。
现在让我们创建新的组和用户。
要创建新组 运行,请执行以下命令:
sudo groupadd appmgr
现在让我们创建新用户并将其添加到一个组中。
sudo useradd –G appmgr minecraft
现在您的服务已创建,我们需要启用它并运行它是第一次。
systemctl enable minecraft-server
systemctl start minecraft-server
编写 php 脚本以重新启动服务的最后一步:
<?php
exec("systemctl restart minecraft-server");
?>
我目前正在 运行 自己的 Minecraft 服务器,我想构建一个选项来通过 PHP 重启 Minecraft 服务器,这样我的朋友就可以在不需要访问权限的情况下重启 MC 服务器到我的实际服务器。
因此,首先我想创建一个脚本来启动服务器:
startup.php
<?php
chdir('/home/minecraft/minecraft_server/');
exec("./start");
?>
开始
screen -mdS "minecraft_up" java -Xmx4G -Xms4G -jar server.jar nogui
经过一些权限问题等,通过调用 webadress 可以启动服务器。
现在,我的问题是我无法访问屏幕进程。
当运行宁ps -ef
我得到:
UID PID PPID C TTY TIME CMD
www-data 29642 1 0 ? 00:00:00 SCREEN -mdS minecraft_up jav
www-data 29643 29642 99 pts/5 00:02:07 java -Xmx4G -Xms4G -jar serv
当运行宁sudo pwdx 29642
获取进程位置时我得到:
29642: /home/minecraft/minecraft_server
但是当我进入 /home/minecraft/minecraft_server
目录并 运行 screen -ls
或 sudo screen -ls
时,两次我都得到:
No Sockets found in /run/screen/S-minecraft.
对比:在终端中手动执行start文件时,当运行ning screen -ls
时其实可以看到进程(或者用screen -r
打开):
There is a screen on:
29025.minecraft_up (01/24/2021 01:32:45 PM) (Detached)
1 Socket in /run/screen/S-minecraft.
我也得到了相同的工作目录,但我无法在进程启动时手动 运行 启动文件 py PHP 仍然是 运行ning.
我真的不是Linux方面的专家,我猜是有一些用户权限干扰或者PHP被当作自己的用户,我真的不知道,这就是我问的原因。
如何访问由 PHP 启动的这个进程?
要使用 systemd
创建服务:
在 /etc/systemd/system/
中创建一个名为 minecraft-server.service
的文件,内容如下:
[Unit]
Description=Minecraft server
After=network.target
StartLimitIntervalSec=0
[Service]
Type=simple
Restart=always
RestartSec=1
User=minecraft
Group=appmgr
ExecStart=java -Xmx4G -Xms4G -jar server.jar
[Install]
WantedBy=multi-user.target
用完整路径替换 server.jar
。
现在让我们创建新的组和用户。
要创建新组 运行,请执行以下命令:
sudo groupadd appmgr
现在让我们创建新用户并将其添加到一个组中。
sudo useradd –G appmgr minecraft
现在您的服务已创建,我们需要启用它并运行它是第一次。
systemctl enable minecraft-server
systemctl start minecraft-server
编写 php 脚本以重新启动服务的最后一步:
<?php
exec("systemctl restart minecraft-server");
?>