Bash - 将 stdout 和 stderr 重定向到具有后台进程的文件
Bash - redirect stdout and stderr to files with background process
我为正在构建的应用程序创建了一个简单的初始化脚本。脚本的开始部分如下所示:
user="ec2-user"
name=`basename [=11=]`
pid_file="/var/run/python_worker.pid"
stdout_log="/var/log/worker/worker.log"
stderr_log="/var/log/worker/worker.err"
get_pid() {
cat "$pid_file"
}
is_running() {
[ -f "$pid_file" ] && ps `get_pid` > /dev/null 2>&1
}
case "" in
start)
if is_running; then
echo "Already started"
else
echo "Starting $name"
cd /var/lib/worker
. venv/bin/activate
. /etc/profile.d/worker.sh
python run.py >> "$stdout_log" 2>> "$stderr_log" &
echo $! > "$pid_file"
if ! is_running; then
echo "Unable to start, see $stdout_log and $stderr_log"
exit 1
fi
echo "$name running"
fi
我在使用这条线时遇到了问题:
python run.py >> "$stdout_log" 2>> "$stderr_log" &
我想用这段代码启动我的应用程序并将输出重定向到上面指定的文件。但是,当我在后台包含 &
使其成为 运行 时,两个日志文件中什么也没有出现。但是,当我从此行中删除 &
时,日志文件会获取数据。为什么会这样?
显然我需要 运行 命令使其 运行 作为后台进程以停止 shell 等待。
我也确信当我使用 & 时进程是 运行ning。我可以用 ps -aux
:
找到它
root 11357 7.0 3.1 474832 31828 pts/1 Sl 21:22 0:00 python run.py
有人知道我做错了什么吗? :)
Anyone know what I'm doing wrong? :)
简答:
是的。将 -u
添加到 python 命令,它应该可以工作。
python -u run.py >> "$stdout_log" 2>> "$stderr_log" &
长答案:
这是一个缓冲问题(来自man python
):
-u Force stdin, stdout and stderr to be totally unbuffered. On systems where it matters, also put stdin, stdout
and stderr in binary mode. Note that there is internal buffering in xreadlines(), readlines() and file-
object iterators ("for line in sys.stdin") which is not influenced by this option. To work around this, you
will want to use "sys.stdin.readline()" inside a "while 1:" loop.
我为正在构建的应用程序创建了一个简单的初始化脚本。脚本的开始部分如下所示:
user="ec2-user"
name=`basename [=11=]`
pid_file="/var/run/python_worker.pid"
stdout_log="/var/log/worker/worker.log"
stderr_log="/var/log/worker/worker.err"
get_pid() {
cat "$pid_file"
}
is_running() {
[ -f "$pid_file" ] && ps `get_pid` > /dev/null 2>&1
}
case "" in
start)
if is_running; then
echo "Already started"
else
echo "Starting $name"
cd /var/lib/worker
. venv/bin/activate
. /etc/profile.d/worker.sh
python run.py >> "$stdout_log" 2>> "$stderr_log" &
echo $! > "$pid_file"
if ! is_running; then
echo "Unable to start, see $stdout_log and $stderr_log"
exit 1
fi
echo "$name running"
fi
我在使用这条线时遇到了问题:
python run.py >> "$stdout_log" 2>> "$stderr_log" &
我想用这段代码启动我的应用程序并将输出重定向到上面指定的文件。但是,当我在后台包含 &
使其成为 运行 时,两个日志文件中什么也没有出现。但是,当我从此行中删除 &
时,日志文件会获取数据。为什么会这样?
显然我需要 运行 命令使其 运行 作为后台进程以停止 shell 等待。
我也确信当我使用 & 时进程是 运行ning。我可以用 ps -aux
:
root 11357 7.0 3.1 474832 31828 pts/1 Sl 21:22 0:00 python run.py
有人知道我做错了什么吗? :)
Anyone know what I'm doing wrong? :)
简答:
是的。将 -u
添加到 python 命令,它应该可以工作。
python -u run.py >> "$stdout_log" 2>> "$stderr_log" &
长答案:
这是一个缓冲问题(来自man python
):
-u Force stdin, stdout and stderr to be totally unbuffered. On systems where it matters, also put stdin, stdout
and stderr in binary mode. Note that there is internal buffering in xreadlines(), readlines() and file-
object iterators ("for line in sys.stdin") which is not influenced by this option. To work around this, you
will want to use "sys.stdin.readline()" inside a "while 1:" loop.