CENTOSサーバーでpythonスクリプトを実行したい:
#!/usr/bin/env python
import socket
try:
import thread
except ImportError:
import _thread as thread #Py3K changed it.
class Polserv(object):
def __init__(self):
self.numthreads = 0
self.tidcount = 0
self.port = 843
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.sock.bind(('100.100.100.100', self.port))
self.sock.listen(5)
def run(self):
while True:
thread.start_new_thread(self.handle, self.sock.accept())
def handle(self,conn,addr):
self.numthreads += 1
self.tidcount += 1
tid=self.tidcount
while True:
data=conn.recv(2048)
if not data:
conn.close()
self.numthreads-=1
break
#if "<policy-file-request/>\0" in data:
conn.sendall(b"<?xml version='1.0'?><cross-domain-policy><allow-access-from domain='*' to-ports='*'/></cross-domain-policy>")
conn.close()
self.numthreads-=1
break
#conn.sendall(b"[#%d (%d running)] %s" % (tid,self.numthreads,data) )
Polserv().run()
$ python flashpolicyd.py
を使用していますが、問題なく動作します...問題は、sshコンソールを閉じた後でもこのスクリプトを実行し続ける方法ですか?
this コードを使用して、アプリケーションをデーモン化します。次のコマンドを使用して、start/stop/restart
スクリプトを使用できます。
python myscript.py start
python myscript.py stop
python myscript.py restart
これに加えて、サービスを制御するための init.d スクリプトもあります。これにより、オペレーティングシステムの起動時にサービスを自動的に開始できます。
簡単な例を示します。コードをクラス内に移動し、run
内のMyDeamon
関数からコードを呼び出すだけです。
import sys
import time
from daemon import Daemon
class YourCode(object):
def run(self):
while True:
time.sleep(1)
class MyDaemon(Daemon):
def run(self):
# Or simply merge your code with MyDaemon.
your_code = YourCode()
your_code.run()
if __== "__main__":
daemon = MyDaemon('/tmp/daemon-example.pid')
if len(sys.argv) == 2:
if 'start' == sys.argv[1]:
daemon.start()
Elif 'stop' == sys.argv[1]:
daemon.stop()
Elif 'restart' == sys.argv[1]:
daemon.restart()
else:
print "Unknown command"
sys.exit(2)
sys.exit(0)
else:
print "usage: %s start|stop|restart" % sys.argv[0]
sys.exit(2)
Upstart
Upstartを使用しているオペレーティングシステム(CentOS 6など)を実行している場合-Upstartを使用してサービスを管理することもできます。 Upstartを使用する場合は、スクリプトをそのままにして、/etc/init/my-service.conf
の下に次のようなものを追加するだけです。
start on started sshd
stop on runlevel [!2345]
exec /usr/bin/python /opt/my_service.py
respawn
その後、start/stop/restartを使用してサービスを管理できます。
例えば.
start my-service
stop my-service
restart my-service
Upstartを使用したより詳細な例が利用可能です here 。
Systemd
Systemd(CentOS 7など)を使用するオペレーティングシステムを実行している場合、次の Stackoverflow answer を確認できます。
私は2つの推奨事項を提供します:
1)supervisor
パッケージをインストールします( 詳細な説明はこちら ):
Sudo apt-get install supervisor
2)/etc/supervisor/conf.d/flashpolicyd.conf
でデーモンの構成ファイルを作成します。
[program:flashpolicyd]
directory=/path/to/project/root
environment=ENV_VARIABLE=example,OTHER_ENV_VARIABLE=example2
command=python flashpolicyd.py
autostart=true
autorestart=true
3)supervisor
を再起動して、新しい.conf
をロードします
supervisorctl update
supervisorctl restart flashpolicyd
[Unit]
Description=My Python daemon
[Service]
Type=simple
ExecStart=/usr/bin/python3 /opt/project/main.py
WorkingDirectory=/opt/project/
Environment=API_KEY=123456789
Environment=API_PASS=password
Restart=always
RestartSec=2
[Install]
WantedBy=sysinit.target
このファイルを/etc/systemd/system/my_daemon.service
に配置し、systemctl daemon-reload && systemctl enable my_daemon && systemctl start my_daemon --no-block
を使用して有効にします。
ログを表示するには:
systemctl status my_daemon
私のPython以外のアプローチでは、&接尾辞を使用します。あれは:
python flashpolicyd.py &
スクリプトを停止するには
killall flashpolicyd.py
また、パイソンと接尾辞がdisownの場合、プロセスは上位(上位)の下に配置されます。
python flashpolicyd.pi & disown
getpid関数から使用するよりもアプリのOSモジュールを最初にインポートし、pidのアプリを取得してfile.forに保存します:
import os
pid = os.getpid()
op = open("/var/us.pid","w")
op.write("%s" % pid)
op.close()
/etc/init.dパスにbashファイルを作成します:/etc/init.d/servername
PATHAPP="/etc/bin/userscript.py &"
PIDAPP="/var/us.pid"
case $1 in
start)
echo "starting"
$(python $PATHAPP)
;;
stop)
echo "stoping"
PID=$(cat $PIDAPP)
kill $PID
;;
esac
今、uはdownコマンドでurアプリを起動および停止できます:
サービスサーバー名停止サービスサーバー名開始
または
/etc/init.d/servername stop /etc/init.d/servername start
私のpythonスクリプトには、...を使用します.
pythonスクリプトを開始するには:
start-stop-daemon --start --background --pidfile $PIDFILE --make-pidfile --exec $DAEMON
pythonスクリプトを停止するには:
PID=$(cat $PIDFILE)
kill -9 $PID
rm -f $PIDFILE
追伸:英語が下手でごめんなさい、私はチリ出身です:D