Shebang用nohup启动Python脚本

时间:2016-01-09 17:31:11

标签: python bash shebang

我发现要写很长时间了:

$sql="SELECT * FROM tracks ORDER BY $sort";

echo '<tr>';
echo '<td><a href="report_tracks.php?s=title">Title</a><td>';
echo '<td><a href="report_tracks.php?s=album">Album</a><td>';
echo '<td><a href="report_tracks.php?s=artist">Artist</a><td>';
echo '<td><a href="report_tracks.php?s=count">Count</a><td>';
echo '</tr>';

每次我想将Python脚本作为后台进程启动。

是否有可能有类似shebang的第一行脚本,如:

nohup python -u myscript.py > log.txt 2>&1 &

这样的命令就像

#!nohup python -u myscript.py > log.txt 2>&1 &
import time
while True:
    print 'hello'
    time.sleep(1)

会自动启动脚本,并在run myscript.py 的第一行显示命令吗?

注意:我正在寻找一个单文件解决方案,我不希望在myscript.py上有第二个文件myscript.sh bash脚本来完成这项工作。< / em>的

3 个答案:

答案 0 :(得分:1)

我担心,这不是直接可能的,但你可以像这样克服它:

在某处创建文件run_py.sh(可能在/ home / basj / bin /中)并使其可运行:

#!/bin/bash
nohup python -u "$@" > log.txt 2>&1 &

然后在你的python文件中包含这个标题(并使它们可运行)

#!/home/basj/bin/run_py.sh
print "I am in python on background with nohup now :)"

答案 1 :(得分:0)

好吧,这个写入Meal而不是自定义文件。而afaik,使用shebang hack暂停到后台是不可能的

nohup.out

给shebang解释器(Berkeley exec hack)提供参数不支持任何形式的io重定向,所以最好的选择可能是使用gilhad's answer中描述的自定义脚本

答案 2 :(得分:0)

如上面的评论所述,您可以尝试使用os.fork()将脚本发送到后台。对于stdout / stderr重定向,您还可以覆盖文件句柄以获得所需的结果。看看这个例子:

import os
import sys

class LogWriter(object):
    def __init__(self, logfile):
        self._f = open(logfile, "w")

    def write(self, data):
        self._f.write(data)
        self._f.flush()

logger = LogWriter("test.log")
sys.stdout = logger
sys.stderr = logger

if os.fork():
    sys.exit()

# Main loop
import time
while True:
    print 'hello'
    time.sleep(1)

引入类LogWriter以向每次写入添加flush(),这会发生。如果你关闭启动脚本的ssh会话,分叉进程仍然在运行。