sqlalchemy + python-daemon
]# /home/python2.7/bin/pip install SQLAlchemy
]# /home/python2.7/bin/pip install mysql-python
]# mkdir /home/package_manager
]# cd /home/package_manager
]# mkdir bin lib log run
]# cd bin
]# vi package_manager.py
#!/home/python2.7/bin/python # -*- coding: UTF-8 -*- import sys import time from daemon.runner import DaemonRunner sys.path.append("/home/package_manager/lib") class App(object): def __init__(self): self.stdin_path = "/dev/null" self.stdout_path = "/dev/tty" self.stderr_path = "/dev/tty" self.pidfile_timeout = 0 self.pidfile_path = "/home/package_manager/run/app.pid" def run(self): from database import session from models import APMDistributionQueue while 1: tasks = session.query(APMDistributionQueue).all() for task in tasks: print task.server_info.hostn time.sleep(10) def main(): DaemonRunner(App()).do_action() if __name__ == "__main__": main() |
]# cd lib
]# vi database.py
# -*- coding: UTF-8 -*- from sqlalchemy import create_engine from sqlalchemy.orm import scoped_session, sessionmaker from sqlalchemy.ext.declarative import declarative_base engine = create_engine('mysql+mysqldb://아이디:비밀번호@localhost/manager_new', convert_unicode=True) Base = declarative_base() session = scoped_session(sessionmaker(autocommit=False, autoflush=False, bind=engine)) |
]# vi models.py
# -*- coding: UTF-8 -*- from sqlalchemy.sql import func from sqlalchemy import ForeignKey, Column, Integer, String, DateTime, Table from sqlalchemy.orm import relationship, backref from database import Base, engine class ServerInfo(Base): __table__ = Table('info', Base.metadata, autoload=True, autoload_with=engine) class APMPackage(Base): __tablename__ = 'apm_package' id = Column(Integer, primary_key=True) name = Column(String(100), unique=True) packaging_file = Column(String(200)) unpackaging_path = Column(String(200)) queue = relationship("APMDistributionQueue", backref=backref('package'), cascade='all, delete, delete-orphan') def __init__(self, name, file, path): self.name = name self.packaging_file = file self.unpackaging_path = path def __repr__(self): return "%s %s %s %s" % (self.id, self.name, self.packaging_file, self.unpackaging_path) class APMDistributionQueue(Base): __tablename__ = 'apm_distribution_queue' id = Column(Integer, primary_key=True) mode = Column(String(20), nullable=False) server_id = Column(Integer, ForeignKey(ServerInfo.idx), nullable=False) package_id = Column(Integer, ForeignKey(APMPackage.id), nullable=False) status = Column(Integer, default=1, nullable=False) reg_date = Column(DateTime(timezone=True), default=func.now(), nullable=False) server_info = relationship("ServerInfo", backref=backref('queue')) def __init__(self, mode, sid, pid): self.mode = mode self.server_id = sid self.package_id = pid def __repr__(self): return "%s %s %s %s" % (self.id, self.mode, self.server_id, self.package_id) |
]# cd ../bin
]# package_manager.py start
프로세스가 fork 되면서 sqlalchemy 의 connection pool과의 연결이 끊기는 문제가 발생해서 한참을 고생했다.
해결방법은 run 메소드 안에서 database.py 를 import 하거나 engine 생성시에 pool_recycle 값을 0으로 설정하면 된다.
새로 만든 테이블과 기존에 있던 테이블을 같이 사용하기 위해 declarative_base, automap_base 중 어떤 맵핑클래스를
사용하는지에따라 구현하는부분이 달라지는데 테스트코드를 만들어봐야 이해할듯하다.
http://programtalk.com/python-examples/daemon.pidfile.PIDLockFile/
'Python' 카테고리의 다른 글
pidlockfile.py for windows (0) | 2016.12.19 |
---|---|
cygwin + ssh + rsync (0) | 2016.12.10 |
remove ^M(Carriage Return) (0) | 2016.11.30 |
pexpect.pxssh (0) | 2016.11.24 |
PEP8 (0) | 2016.11.24 |