0

基本的に、私はいくつかの番号付きオプションから選択できるアプリケーションを構築しています。

main.pyという名前が付けられています。モジュールを個別に実行できるように、可能なオプションごとにスタンドアロン モジュールを作成しました。今私が書いたこの1つのモジュールには、スレッド化されたクラスが含まれています。コマンドを実行するときに発生する問題python mod_keepOnline.pyは、制御が端末 |AND| に返されないことです。モジュールを介してmain.pyを実行すると、main.pyは選択する新しい選択肢のリッスンを停止します。スレッドのせいだとわかっています。どうすれば「スレッドが生成された後、スレッドに独自のスレッドを管理させる」ことができるのだろうと思っていました。mod_keepOnline.pyしたがって、制御を端末またはメイン スクリプトに戻します。

また、解放されたスレッドを再び強制終了できるようにしたいと考えています。

何かのようなものmod_keepOnline.py -killAll

ええと、私のコードは次のとおりです。

###########################################
################## SynBitz.net ############
import threading
import objects
import time
import mechanize
import os
import gb
##########################################
class Class_putOnline (threading.Thread):
    def __init__ (self,person,onlineTime):
        threading.Thread.__init__ (self)
        self.startTime = time.time()
        self.alive = True
        self.person = person
        self.onlineTime = onlineTime
        self.firstMessage=True
    def run(self):
        while(self.alive):
            if(self.firstMessage):
                print self.person.getInfo() + " SPAWNED ONLINE"
                self.firstMessage=False

            self.person.login()
            time.sleep(300)
            self.person.logout()
            if((time.time()-self.startTime) > self.onlineTime):
                print self.person.getInfo() + " SPAWNED OFFLINE "
                self.alive = False
                self._Thread__stop()
#########################################              
def main():
    for line in open(gb.accFile,"r"):
        gb.accountList.append(line.rstrip('\n'))
    for account in gb.accountList:
        gb.accountInfo = account.split('|',4)
        browser =  mechanize.Browser()
        browser.set_handle_robots(False)
        browser.set_handle_redirect(True)
        browser.set_handle_referer(True)
        browser.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]  
        gb.spiderList.append(objects.spider.Bot(gb.accountInfo[0],gb.accountInfo[2],gb.accountInfo[1],gb.accountInfo[3],browser))
    if gb.accountInfo[2] not in gb.distros:
        gb.distros.append(gb.accountInfo[2])
    onlineAccounts = []
    for index, acc in enumerate(gb.spiderList):
        onlineAccounts.append(Class_putOnline(acc,115200)) # 600*6*8*4= 28800 = 8 uur 3600 test seconds = 1 h (1200 seconds for test time of 20 minutes...  )
        time.sleep(0.1)
        onlineAccounts[index].start()

if __name__ == "__main__":
    main()

サーバーへの ssh セッションを開いて Python スクリプトを実行すると、バックグラウンドで実行しても、セッションを閉じると終了します。接続していないときにスクリプトを実行し続けるにはどうすればよいですか?

4

2 に答える 2

0

私が理解しているように:

プロセスを実行すると、端末の入出力がプロセスの入出力にリダイレクトされます。

スレッドを開始しても、これで何も変わりません。プロセスには、両方が存在する限り、端末の入力と出力があります。できることは、このプログラムをバックグラウンドに送信することです (control-z を使用)。

プログラムを実行すると、独自の名前空間があります。モジュールをインポートしてその属性を変更することはできますが、これによって別のプログラムのモジュールが変更されることはありません。

2 つのプログラムが必要な場合、1 つはバックグラウンドですべてのタスク (Tyson によって提案されたジョブなど) を実行し、もう 1 つはコマンド ラインから実行されます。これら 2 つのプロセス間で通信する必要があります。

プロセスの境界を回避する他の方法があるかもしれませんが、私はそれらを知りません。

したがって、値を保存できるこのモジュールを作成しました。値が直接保存されるたびに、モジュールの状態がディスクに保存されます。

'''
This is a module with persistent attributes

the attributes of this module are spread all over all instances of this module
To set attributes:
    import runningConfiguration
    runningConfiguration.x = y

to get attributes:
    runningConfiguration.x

'''

import os
import types
import traceback

fn = fileName = fileName = os.path.splitext(__file__)[0] + '.conf'

class RunningConfiguration(types.ModuleType):

    fileName = fn

    def __init__(self, *args, **kw):
        types.ModuleType.__init__(self, *args, **kw)
        import sys
        sys.modules[__name__] = self
        self.load()

    def save(self):
        import pickle
        pickle.dump(self.__dict__, file(self.fileName, 'wb'))

    def load(self):
        import pickle
        try:
            dict = pickle.load(file(self.fileName, 'rb'))
        except EOFError:
            pass
        except:
            import traceback
            traceback.print_exc()
        else:   
            self.__dict__.update(dict)

    def __setattr__(self, name, value):
##        print 'set', name, value,
        l = []
        v1 = self.__dict__.get(name, l)
        self.__dict__[name] = value
        try:
            self.save()
##            print 'ok'
        except:
            if v1 is not l:
                self.__dict__[name] = v1
            raise

    def __getattribute__(self, name):
        import types
        if name in ('__dict__', '__class__','save','load','__setattr__',                    '__delattr__', 'fileName'):
            return types.ModuleType.__getattribute__(self, name)
##        print 'get', name
        self.load()
        l = []
        ret = self.__dict__.get(name, l)
        if ret is l:
            if hasattr(self.__class__, name):
                return getattr(self.__class__, name)
            if name in globals():
                return globals()[name]
            raise AttributeError('%s object has no attribute %r' %                                  (self.__class__.__name__, name))
        return ret

    def __delattr__(self, name):
        del self.__dict__[name]
        self.save()




RunningConfiguration(__name__)

runningConfiguration.py に保存しました。

次のように使用できます。

# program1
import runningConfiguration
if not hasattr(runningConfiguration, 'programs'):
    runningConfiguration.programs = [] ## variable programs is set
runningConfiguration.programs+= ['program1'] ## list is changed and = is used -> module is saved

これは安全でないモジュールであり、すべてを保存できるわけではありませんが、多くのことを保存できます。また、2 つのモジュールを同時に保存すると、最初に書き込まれた値が失われる場合があります。

試してみてください: 2 つの異なるプログラムから ist をインポートして、どのように動作するかを確認してください。

于 2012-07-26T20:53:35.713 に答える
0

サーバーへの ssh セッションを開いて Python スクリプトを実行すると、バックグラウンドで実行しても、セッションを閉じると終了します。接続していないときにスクリプトを実行し続けるにはどうすればよいですか?

スクリプトをオンデマンドで実行する必要がある場合は、cronjob として実行し、手動で cronjob を開始します。

わかりました、私はPythonにかなり慣れていません

私も。

編集: クイック ヒント、長いコメントには """ を使用します。

例:

"""説明:

これはこれを行い、これを拡張します。あれこれ使ってください。

"""

于 2012-06-06T22:11:59.403 に答える