我在我的机器上运行两个 minecraft 服务器。我想知道正在运行的单个 mc 服务器的 pid 是什么,并将其放入文件,以便我以后可以杀死它。所以对于这个例子,我只想知道 World2 的 PID 是什么,没有别的,并将其保存到文件中。
当我执行命令时
ps h -o pid,cmd -u minecraft
Run Code Online (Sandbox Code Playgroud)
我得到以下结果
31416 /usr/lib/jvm/java-8-oracle/jre/bin/java -Xmx2G -Xms1G -jar /data/mc-server/World1/minecraft_server.jar nogui
31706 /usr/lib/jvm/java-8-oracle/jre/bin/java -Xmx6G -Xms4G -jar /data/mc-server/World2/craftbukkit.jar nogui
Run Code Online (Sandbox Code Playgroud)
然后我使用这个命令管道到 grep
grep World2
Run Code Online (Sandbox Code Playgroud)
这就是我遇到困难的地方,然后我通过管道获取单个结果。我尝试了以下但无法得到它。
awk '{print $1 > world2.pid}'
Run Code Online (Sandbox Code Playgroud)
所以我的完整命令是:
ps h -o pid,cmd -u minecraft | grep World2 | awk '{print $1 > world2.pid}'
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
awk: cmd. line:1: {print $1 > world2.pid}
awk: cmd. line:1: ^ syntax error
Run Code Online (Sandbox Code Playgroud)
如果要将重定向放在awk 中,则需要将文件名放在引号中 - 否则,awk 会将其视为变量而不是文字字符串:
... | awk '{print $1 > "world2.pid"}'
Run Code Online (Sandbox Code Playgroud)
然而,让 awk 写入标准输出并重定向它会更传统,即
... | awk '{print $1}' > world2.pid
Run Code Online (Sandbox Code Playgroud)
或者,您可能想查看pgrep用于整个任务的用途,例如
pgrep -f 'World2' > world2.pid
Run Code Online (Sandbox Code Playgroud)
如果你把> world2.pidafter awk '{print $1}',它应该工作:
ps h -o pid,cmd -u minecraft | grep World2 | awk '{print $1}' > world2.pid
Run Code Online (Sandbox Code Playgroud)
然后输出:
ps h -o pid,cmd -u minecraft | grep World2 | awk '{print $1}'
Run Code Online (Sandbox Code Playgroud)
写到:
world2.pid
Run Code Online (Sandbox Code Playgroud)
或者
正如@JonathanLeffler 所建议的(感谢),您可以节省使用grep:
ps h -o pid,cmd -u minecraft | awk '/World2/ {print $1}' > world2.pid
Run Code Online (Sandbox Code Playgroud)