我目前有一个Bash脚本,最后使用exec
来启动正在运行的服务器进程:
#! /bin/bash
.
.
.
exec python -m SimpleHTTPServer 8080
但是现在,我不想仅仅exec
执行命令,而是在exec
压缩我的调用shell程序之前“热身”服务器进程。有点像:
#! /bin/bash
python -m SimpleHTTPServer 8080 &
for index in $(seq 100); do
curl -X GET http://localhost:8080/warm/up
done
# => How can I exec when my command is already running?
据我了解,exec
只能接受命令,但不能接受正在运行的进程PID等。
在这种情况下,我真的不想将调用的Bash shell留作python
服务器的父节点,以避免在父节点中出现任何信号处理陷阱。
答案 0 :(得分:1)
只需预测您的热身而不是服务器:
#! /bin/bash
{
sleep 5
for index in $(seq 100); do
curl -X GET http://localhost:8080/warm/up
done
} &
exec python -m SimpleHTTPServer 8080
答案 1 :(得分:0)
执行此操作以启动服务器并将其与shell进程取消关联
nohup python -m SimpleHTTPServer 8080 &
disown
然后你可以调用你的热身网址并简单地让脚本退出。
答案 2 :(得分:0)
exec
command
来自man bash
(尝试man -P'less +"/^ *exec "' bash
):
exec [-cl] [-a name] [command [arguments]] If command is specified, it replaces the shell. No new process is created. The arguments become the arguments to command...
所以That other guy's answer是正确的,但你使用的方式也是正确的! The point of glenn jackman非常重要,以防您计划使用此脚本在生产环境中运行服务器(即:关闭会话后让它们保持运行)。
exec command [args]
的目标是结束当前的shell会话并改为运行 command [and args]
。作为替换但使用相同的进程ID 。当您在文件中记录进程ID 时,这非常有用:
#!/bin/bash
echo $$ >/var/run/SimpleHTTPServer.pid
exec python -m SimpleHTTPServer 8080
或
#!/bin/bash
bash -c 'echo $$ >/var/run/SimpleHTTPServer.pid &&
exec python -m SimpleHTTPServer 8080' &
for index in $(seq 100); do
curl -X GET http://localhost:8080/warm/up
done