পাইথনের কোনও ফাইলে স্টাডাউট পুনর্নির্দেশ করবেন?


313

আমি কীভাবে পাইথনের একটি স্বেচ্ছাসেবী ফাইলে স্টডআউটকে পুনর্নির্দেশ করব?

যখন দীর্ঘ-চলমান পাইথন স্ক্রিপ্ট (উদাহরণস্বরূপ, ওয়েব অ্যাপ্লিকেশন) ssh সেশনের মধ্যে থেকে শুরু হয়ে ব্যাকগাউন্ড করা হয়, এবং ssh অধিবেশন বন্ধ হয়ে যায়, তখন অ্যাপ্লিকেশনটি আইওআরারের উত্থাপন করবে এবং স্টাডআউটে লেখার চেষ্টা করার মুহুর্তে ব্যর্থ হবে। IOError এর কারণে ব্যর্থতা রোধ করতে স্টাডআউটের পরিবর্তে কোনও ফাইলের মধ্যে অ্যাপ্লিকেশন এবং মডিউলগুলি আউটপুট তৈরি করার উপায় খুঁজে পাওয়া দরকার to বর্তমানে, আমি কোনও ফাইলের আউটপুট পুনর্নির্দেশের জন্য নোহুপকে নিয়োগ করি এবং এটি কাজটি হয়ে যায় তবে আমি ভাবছিলাম যে কৌতূহলের বাইরে নোহুপ ব্যবহার না করে এটি করার কোনও উপায় আছে কিনা।

আমি ইতিমধ্যে চেষ্টা করেছি sys.stdout = open('somefile', 'w'), তবে এটি কিছু বাহ্যিক মডিউলগুলি টার্মিনালে আউটপুট করা থেকে আটকাচ্ছে বলে মনে হয় না (বা সম্ভবত sys.stdout = ...লাইনটি আগুন জ্বলেনি)। আমি জানি যে এটি পরীক্ষা করা সহজ সরল স্ক্রিপ্টগুলি থেকে কাজ করা উচিত, তবে ওয়েব অ্যাপ্লিকেশনটিতে পরীক্ষার জন্য আমার এখনও সময় হয়নি।


8
এটি আসলে একটি অজগর জিনিস নয়, এটি শেলের কাজ। কেবল আপনার স্ক্রিপ্টটি চালানscript.p > file
ফালমারি

আমি বর্তমানে নোহুপ ব্যবহার করে সমস্যাটি সমাধান করেছি, তবে আমি ভেবেছিলাম আরও কিছু চালাক হতে পারে ...

1
@ ফক্সবুনি: নাহপ? সহজভাবে কেন someprocess | python script.py? কেন জড়িত nohup?
এস.লট

3
Stdlib থেকে মডিউলটি printপ্রয়োগ করতে বিবৃতিগুলি loggingপুনরায় লিখুন। তারপর আপনি আউটপুট সর্বত্র পুনর্নির্দেশ করতে পারেন আপনিও কত সংখ্যক আউটপুট বেশিরভাগ ক্ষেত্রেই উৎপাদন কোড ইত্যাদি চান উচিত না উপর নিয়ন্ত্রণ printকিন্তু log
এরিকবার্ক

2
সম্ভবত এই সমস্যার আরও ভাল সমাধান হ'ল স্ক্রিন কমান্ড, যা আপনার বাশ সেশনটি সংরক্ষণ করবে এবং আপনাকে এটি বিভিন্ন রান থেকে অ্যাক্সেস করার অনুমতি দেবে।
রায়ান আমোস

উত্তর:


402

আপনি যদি পাইথন স্ক্রিপ্টের মধ্যে পুনর্নির্দেশটি করতে চান তবে sys.stdoutকোনও ফাইলের জন্য সেট করে নেওয়া কৌশলটি করতে পারে:

import sys
sys.stdout = open('file', 'w')
print('test')

এক্সিকিউট করার সময় শেল পুনঃনির্দেশ ব্যবহার করা (উইন্ডোজ এবং লিনাক্সে একই):

$ python foo.py > file


7
এটি এর সাথে কাজ করে না from sys import stdout, কারণ এটি একটি স্থানীয় অনুলিপি তৈরি করে। এছাড়াও আপনি এটি ব্যবহার করতে পারেন with, যেমন with open('file', 'w') as sys.stdout: functionThatPrints()। আপনি এখন functionThatPrints()সাধারণ printবিবৃতি ব্যবহার করে প্রয়োগ করতে পারেন ।
মিগল্ড

41
একটি স্থানীয় অনুলিপি রাখা ভাল, stdout = sys.stdoutযাতে আপনি এটি শেষ হয়ে গেলে এটি পুনরায় রাখতে পারেন sys.stdout = stdout,। এইভাবে যদি আপনাকে এমন কোনও ফাংশন থেকে ডেকে আনা হয় যা ব্যবহার করে তবে printআপনি সেগুলিকে টানবেন না।
মিগল্ড

4
@ জন: buffering=0বাফারিং অক্ষম করে (এটি নেতিবাচকভাবে কার্য সম্পাদনকে প্রভাবিত করতে পারে (10-100 বার))। buffering=1লাইন বাফারিং সক্ষম করে যাতে আপনি tail -fলাইন-ভিত্তিক আউটপুট ব্যবহার করতে পারেন ।
jfs

41
@ এমগোল্ড বা আপনি sys.stdout = sys.__stdout__এটি ফিরে পেতে ব্যবহার করতে পারেন ।
ক্লেমেটয়

175

নেই contextlib.redirect_stdout()ফাংশন পাইথন 3.4 মধ্যে:

from contextlib import redirect_stdout

with open('help.txt', 'w') as f:
    with redirect_stdout(f):
        print('it now prints to `help.text`')

এটি অনুরূপ:

import sys
from contextlib import contextmanager

@contextmanager
def redirect_stdout(new_target):
    old_target, sys.stdout = sys.stdout, new_target # replace sys.stdout
    try:
        yield new_target # run some code with the replaced stdout
    finally:
        sys.stdout = old_target # restore to the previous value

এটি পূর্ববর্তী পাইথন সংস্করণে ব্যবহার করা যেতে পারে। পরবর্তী সংস্করণটি পুনরায় ব্যবহারযোগ্য নয় । চাইলে এটি তৈরি করা যায়।

এটি ফাইল বর্ণনাকারী স্তরে যেমন স্টডআউটকে পুনঃনির্দেশ করে না:

import os
from contextlib import redirect_stdout

stdout_fd = sys.stdout.fileno()
with open('output.txt', 'w') as f, redirect_stdout(f):
    print('redirected to a file')
    os.write(stdout_fd, b'not redirected')
    os.system('echo this also is not redirected')

b'not redirected'এবং ফাইলে 'echo this also is not redirected'পুনঃনির্দেশিত হয় না output.txt

ফাইল বর্ণনাকারী স্তরে পুনর্নির্দেশ os.dup2()করতে, ব্যবহার করা যেতে পারে:

import os
import sys
from contextlib import contextmanager

def fileno(file_or_fd):
    fd = getattr(file_or_fd, 'fileno', lambda: file_or_fd)()
    if not isinstance(fd, int):
        raise ValueError("Expected a file (`.fileno()`) or a file descriptor")
    return fd

@contextmanager
def stdout_redirected(to=os.devnull, stdout=None):
    if stdout is None:
       stdout = sys.stdout

    stdout_fd = fileno(stdout)
    # copy stdout_fd before it is overwritten
    #NOTE: `copied` is inheritable on Windows when duplicating a standard stream
    with os.fdopen(os.dup(stdout_fd), 'wb') as copied: 
        stdout.flush()  # flush library buffers that dup2 knows nothing about
        try:
            os.dup2(fileno(to), stdout_fd)  # $ exec >&to
        except ValueError:  # filename
            with open(to, 'wb') as to_file:
                os.dup2(to_file.fileno(), stdout_fd)  # $ exec > to
        try:
            yield stdout # allow code to be run with the redirected stdout
        finally:
            # restore stdout to its previous value
            #NOTE: dup2 makes stdout_fd inheritable unconditionally
            stdout.flush()
            os.dup2(copied.fileno(), stdout_fd)  # $ exec >&copied

stdout_redirected()পরিবর্তে যদি ব্যবহৃত হয় তবে একই উদাহরণটি এখন কাজ করে redirect_stdout():

import os
import sys

stdout_fd = sys.stdout.fileno()
with open('output.txt', 'w') as f, stdout_redirected(f):
    print('redirected to a file')
    os.write(stdout_fd, b'it is redirected now\n')
    os.system('echo this is also redirected')
print('this is goes back to stdout')

স্ট্যান্ডআউটে পূর্বে যে আউটপুটটি মুদ্রিত হয়েছিল এখন প্রসঙ্গ ব্যবস্থাপক সক্রিয় output.txtততক্ষণ চলে stdout_redirected()

দ্রষ্টব্য: stdout.flush()পাইথন 3 এ সি স্টডিও বাফারগুলি ফ্লাশ করে না যেখানে I / O সরাসরি read()/ write()সিস্টেমে কল প্রয়োগ করা হয় । সমস্ত ওপেন সি স্টডিও আউটপুট স্ট্রীমগুলি ফ্লাশ করতে, আপনি libc.fflush(None)যদি কিছু সি এক্সটেনশান স্টিডিও ভিত্তিক আই / ও ব্যবহার করেন তবে আপনি স্পষ্টভাবে কল করতে পারেন:

try:
    import ctypes
    from ctypes.util import find_library
except ImportError:
    libc = None
else:
    try:
        libc = ctypes.cdll.msvcrt # Windows
    except OSError:
        libc = ctypes.cdll.LoadLibrary(find_library('c'))

def flush(stream):
    try:
        libc.fflush(None)
        stream.flush()
    except (AttributeError, ValueError, IOError):
        pass # unsupported

আপনি stdoutপ্যারামিটারটি অন্য স্ট্রিমগুলিকে পুনঃনির্দেশ করতে ব্যবহার করতে পারেন , কেবল sys.stdoutউদাহরণস্বরূপ, মার্জ করতে sys.stderrএবং sys.stdout:

def merged_stderr_stdout():  # $ exec 2>&1
    return stdout_redirected(to=sys.stdout, stdout=sys.stderr)

উদাহরণ:

from __future__ import print_function
import sys

with merged_stderr_stdout():
     print('this is printed on stdout')
     print('this is also printed on stdout', file=sys.stderr)

দ্রষ্টব্য: stdout_redirected()মিশ্রিত বাফার I / O ( sys.stdoutসাধারণত) এবং আনফফারড আই / ও (সরাসরি ফাইল বর্ণনাকারীর ক্রিয়াকলাপ)। সাবধান, বাফারিংয়ের সমস্যা হতে পারে ।

উত্তরের জন্য, আপনার সম্পাদনা: আপনি python-daemonআপনার স্ক্রিপ্টটি ডিমনাইজ করতে এবং loggingমডিউলটি (যেমন @ এরিকবি 85 প্রস্তাবিত ) ব্যবহার করতে পারবেন printএবং আপনার দীর্ঘকাল ধরে চলমান পাইথন স্ক্রিপ্টের জন্য কেবল স্ট্রাউডকে পুনর্নির্দেশের জন্য ব্যবহার করতে পারেন যা আপনি nohupএখন ব্যবহার করছেন।


3
stdout_redirectedসহায়ক। সাবধান থাকুন এটি ডক্টেটগুলির মধ্যে কাজ করে না, যেহেতু SpoofOutপ্রতিস্থাপনের জন্য বিশেষ হ্যান্ডলার ডক্টেস্টের sys.stdoutকোনও filenoবৈশিষ্ট্য নেই।
ক্রিস জনসন

@ ক্রিস জনসন: এটি যদি না বাড়ে ValueError("Expected a file (`.fileno()`) or a file descriptor")তবে এটি একটি বাগ। আপনি কি নিশ্চিত যে এটি বাড়িয়েছে না?
jfs

এটি সেই ত্রুটি বাড়িয়ে তোলে যা ডক্টরেস্টের মধ্যে এটি ব্যবহারযোগ্য না। ডক্টেস্টের মধ্যে আপনার ফাংশনটি ব্যবহার করার জন্য, doctest.sys.__stdout__আমরা সাধারণত কোথায় ব্যবহার করব তা নির্দিষ্ট করা প্রয়োজন sys.stdout। এটি আপনার ফাংশনে কোনও সমস্যা নয়, ডক্টেস্টের জন্য কেবল একটি আবাসন প্রয়োজনীয় কারণ এটি স্টডআউটকে এমন কোনও বস্তুর সাথে প্রতিস্থাপন করে যাতে সত্যিকারের ফাইলের সমস্ত বৈশিষ্ট্য নেই।
ক্রিস জনসন

stdout_redirected()হয়েছে stdoutপরামিতি, আপনি এটি সেট করতে পারে sys.__stdout__যদি আপনি আসল পাইথন stdout- এ (যে কোনো বৈধ থাকা উচিত পুনর্নির্দেশ করতে চান .fileno()বেশিরভাগ ক্ষেত্রেই)। বর্তমানের sys.stdoutআলাদা হয়ে থাকলে এটি কিছুই করে না । ব্যবহার করবেন না doctest.sys; এটি দুর্ঘটনাক্রমে উপলব্ধ।
jfs

এটি সত্যই ভাল কাজ করে, যেমন with stdout_redirected(to=fd): with merged_stderr_stdout(): print('...'); print('...', file=sys.stderr)
স্টাডাউট এবং স্টাডারকে

90

আপনি এটি আরও ভাল চেষ্টা করতে পারেন

import sys

class Logger(object):
    def __init__(self, filename="Default.log"):
        self.terminal = sys.stdout
        self.log = open(filename, "a")

    def write(self, message):
        self.terminal.write(message)
        self.log.write(message)

sys.stdout = Logger("yourlogfilename.txt")
print "Hello world !" # this is should be saved in yourlogfilename.txt

পাইপ দেওয়ার জন্য কোনও পরামর্শ loggerনাকি syslog?
dsummersl

আপনি যদি কোনও ফাইল সম্পাদনা করতে চান তবে এটি খুব কার্যকর নয়। যাইহোক সুন্দর
কৌশলটির

10
কোডের জন্য এটির পরিণতি হবে যা ধরে নিয়েছে sys.stdout ফাইলনো () (যা পাইথন স্ট্যান্ডার্ড লাইব্রেরিতে কোড অন্তর্ভুক্ত) সহ পদ্ধতি সহ একটি পূর্ণাঙ্গ ফাইল বস্তু। আমি সেটিতে একটি __getattr __ (স্ব, অ্যাটর) পদ্ধতি যুক্ত করব যা সেলফ.টার্মিনালের সাথে বৈশিষ্ট্যযুক্ত অনুসন্ধানকে স্থগিত করে। def __getattr__(self, attr): return getattr(self.terminal, attr)
পিবডি

4
আপনার def flush(self):ক্লাসে পদ্ধতিও যুক্ত করতে হবে Logger
loretoparisi

1
@ অ্যালোরিটোরিসি তবে আপনি যে পদ্ধতিটি তৈরি করেছেন তাতে আসলে কী ঘটে?
elkshadow5

28

অন্যান্য উত্তরগুলি সেই ক্ষেত্রে কভার দেয় না যেখানে আপনি আপনার নতুন স্টাডাউট ভাগ করে নেওয়ার জন্য কাঁটাচামচ প্রক্রিয়াগুলি চান।

এটা করতে:

from os import open, close, dup, O_WRONLY

old = dup(1)
close(1)
open("file", O_WRONLY) # should open on 1

..... do stuff and then restore

close(1)
dup(old) # should dup to 1
close(old) # get rid of left overs

3
একের সাথে 'ডাব্লু' অ্যাট্রিবিউটটি প্রতিস্থাপন করতে হবে, ওএস.ও_আরওয়্যালি | ওএস.ও_ক্রিট ... "ওএস" কমান্ডগুলিতে স্ট্রিং প্রেরণ করতে পারে না!
Ch'marr

3
পুনর্নির্দেশের ফাইলটি আউটপুট পায় কিনা তা নিশ্চিত করতে স্টেটমেন্টের sys.stdout.flush()আগে একটি প্রবেশ করান । এছাড়াও, আপনি এর জায়গায় একটি ফাইল ব্যবহার করতে পারেন । এবং সাবধান হন আপনার অন্য থ্রেড চলমান নেই যা হ্যান্ডেলটি ব্যবহারের জন্য খোলা হওয়ার আগে ওস এর প্রথম ফাইল হ্যান্ডেলটি চুরি করতে পারে। close(1)'file'tempfile.mkstemp()'file'os.close(1)'file'
অ্যালেক্স রবিনসন

2
এটি os.O_WRONLY | os.O_CREAT ... সেখানে কোনও E নেই।
জেফ শেফিল্ড


@ Ch'marr এটি O_CREAT, O_CREATE নয়।
কোয়ান্ট_দেব

28

পিইপি 343 থেকে উদ্ধৃত - "উইথ" স্টেটমেন্ট (যুক্ত আমদানির বিবৃতি):

অস্থায়ীভাবে পুনঃনির্দেশ করুন:

import sys
from contextlib import contextmanager
@contextmanager
def stdout_redirected(new_stdout):
    save_stdout = sys.stdout
    sys.stdout = new_stdout
    try:
        yield None
    finally:
        sys.stdout = save_stdout

নিম্নলিখিত হিসাবে ব্যবহৃত:

with open(filename, "w") as f:
    with stdout_redirected(f):
        print "Hello world"

এটি অবশ্যই থ্রেড-নিরাপদ নয়, তবে উভয়ই ম্যানুয়ালি এটি একই নাচ করছে না। একক থ্রেডেড প্রোগ্রামগুলিতে (উদাহরণস্বরূপ স্ক্রিপ্টগুলিতে) এটি কাজ করার একটি জনপ্রিয় উপায়।


1
+1 টি। দ্রষ্টব্য: এটি উপ-প্রক্রিয়াগুলির জন্য কাজ করে না যেমন os.system('echo not redirected'),। আমার উত্তরটি দেখায় যে কীভাবে এই জাতীয় আউটপুট পুনর্নির্দেশ করা যায়
jfs

পাইথন 3.4 থেকে শুরু আছে redirect_stdoutমধ্যেcontextlib
ওয়াল্টার Tross


3

এখানে ইয়ুদা প্রবীর উত্তরের একটি ভিন্নতা রয়েছে :

  • প্রয়োগ flush()এবং সমস্ত ফাইল বৈশিষ্ট্য
  • এটি প্রসঙ্গ হিসাবে লিখুন
  • ক্যাপচার stderrএছাড়াও

import contextlib, sys

@contextlib.contextmanager
def log_print(file):
    # capture all outputs to a log file while still printing it
    class Logger:
        def __init__(self, file):
            self.terminal = sys.stdout
            self.log = file

        def write(self, message):
            self.terminal.write(message)
            self.log.write(message)

        def __getattr__(self, attr):
            return getattr(self.terminal, attr)

    logger = Logger(file)

    _stdout = sys.stdout
    _stderr = sys.stderr
    sys.stdout = logger
    sys.stderr = logger
    try:
        yield logger.log
    finally:
        sys.stdout = _stdout
        sys.stderr = _stderr


with log_print(open('mylogfile.log', 'w')):
    print('hello world')
    print('hello world on stderr', file=sys.stderr)

# you can capture the output to a string with:
# with log_print(io.StringIO()) as log:
#   ....
#   print('[captured output]', log.getvalue())

2

এই উত্তরের উপর ভিত্তি করে: https://stackoverflow.com/a/5916874/1060344 , আমি বুঝতে পেরেছি এমন অন্য উপায় যা আমি আমার একটি প্রকল্পে ব্যবহার করি। আপনি যেটি প্রতিস্থাপন করেন sys.stderrবা sys.stdoutযার সাথে, আপনাকে অবশ্যই তা নিশ্চিত করতে হবে যে প্রতিস্থাপনটি fileইন্টারফেসের সাথে সম্মতিযুক্ত, বিশেষত যদি আপনি এমন কিছু করছেন যা আপনার নিয়ন্ত্রণাধীন নয় এমন অন্য কিছু লাইব্রেরিতে stderr / stdout ব্যবহার করা হয়। এই গ্রন্থাগারটি ফাইল অবজেক্টের অন্যান্য পদ্ধতি ব্যবহার করতে পারে।

এই উপায়টি দেখুন যেখানে আমি এখনও সমস্ত কিছু স্টডার / স্ট্ডআউট (বা সেই বিষয়ে কোনও ফাইল) করতে দিয়েছি এবং পাইথনের লগিং সুবিধা ব্যবহার করে একটি লগ ফাইলে বার্তাটি প্রেরণ করেছি (তবে আপনি সত্যিই এটি দিয়ে কিছু করতে পারেন):

class FileToLogInterface(file):
    '''
    Interface to make sure that everytime anything is written to stderr, it is
    also forwarded to a file.
    '''

    def __init__(self, *args, **kwargs):
        if 'cfg' not in kwargs:
            raise TypeError('argument cfg is required.')
        else:
            if not isinstance(kwargs['cfg'], config.Config):
                raise TypeError(
                    'argument cfg should be a valid '
                    'PostSegmentation configuration object i.e. '
                    'postsegmentation.config.Config')
        self._cfg = kwargs['cfg']
        kwargs.pop('cfg')

        self._logger = logging.getlogger('access_log')

        super(FileToLogInterface, self).__init__(*args, **kwargs)

    def write(self, msg):
        super(FileToLogInterface, self).write(msg)
        self._logger.info(msg)

2

আপনার টিমুক বা জিএনইউ স্ক্রিনের মতো একটি টার্মিনাল মাল্টিপ্লেজার প্রয়োজন

আমি আশ্চর্য হয়েছি যে মূল প্রশ্নটির বিষয়ে রায়ান আমোসের একটি ছোট্ট মন্তব্য হ'ল অফারটিতে থাকা অন্য সকলের চেয়ে সমাধানের একমাত্র উল্লেখ কেবল অজগর কৌশলটি কতটা চালাক হতে পারে এবং তারা কতটা উপার্জন পেয়েছিল তা বিবেচনা করে না। রায়ান এর মন্তব্যে আরও বলা হয়েছে, জিএমইউ স্ক্রিনের জন্য tmux একটি দুর্দান্ত বিকল্প।

তবে নীতিটি হ'ল: আপনি যদি লগ-আউট করার সময় নিজেকে টার্মিনাল কাজ চালিয়ে যেতে চান, স্যান্ডউইচের জন্য ক্যাফেতে যান, বাথরুমে যান, পরে যান (ইত্যাদি) এবং পরে, আপনার সাথে আবার সংযোগ স্থাপন করুন যে কোন জায়গায় বা যে কোনো কম্পিউটার থেকে টার্মিনাল সেশন যেন তুমি কখনো দূরে হয়েছে চাই, টার্মিনাল মাল্টিপ্লেক্সার হয় উত্তর। টার্মিনাল সেশনের জন্য সেগুলিকে ভিএনসি বা দূরবর্তী ডেস্কটপ হিসাবে ভাবেন। আর কিছু হ'ল একটি কাজ বোনাস হিসাবে, যখন বস এবং / বা অংশীদার আসে এবং আপনি অজান্তেই আপনার ব্রাউজার উইন্ডোটির ডজযুক্ত সামগ্রীর পরিবর্তে আপনার টার্মিনাল উইন্ডোটি ctrl-w / cmd-w ব্যবহার করেন, আপনি শেষ 18 ঘন্টা মূল্য প্রক্রিয়াকরণটি হারাবেন না !


4
যদিও এ প্রশ্নের উত্তরের জন্য উত্তরের উত্তরটি সম্পাদনার পরে উপস্থিত হয়েছিল; এটি শিরোনামে প্রশ্নের উত্তর দেয় না (বেশিরভাগ লোকেরা শিরোনামের জন্য গুগল থেকে এখানে আসে)
jfs

0

অন্যান্য ভাষায় লিখিত প্রোগ্রামগুলি (উদাহরণস্বরূপ সি) টার্মিনাল থেকে আলাদা করতে (এবং জম্বি প্রক্রিয়াগুলি রোধ করতে) স্পষ্টভাবে স্পেশাল ম্যাজিক করতে হবে (ডাবল-ফোরকিং)। সুতরাং, আমি মনে করি সর্বোত্তম সমাধান হ'ল এগুলি অনুকরণ করা।

আপনার প্রোগ্রামটি পুনরায় সম্পাদন করার একটি প্লাস হ'ল, আপনি কমান্ড-লাইনে পুনঃনির্দেশগুলি চয়ন করতে পারেন, যেমন /usr/bin/python mycoolscript.py 2>&1 1>/dev/null

আরও তথ্যের জন্য এই পোস্টটি দেখুন: ডিমন তৈরি করার সময় ডাবল কাঁটাচামচ করার কারণ কী?


এহ ... বলতে পারি না আমি তাদের নিজস্ব ডাবল-ফোর্কিং পরিচালনার প্রক্রিয়াগুলির একটি অনুরাগী। এটি খুব সাধারণ একটি প্রতিমা, এবং সতর্ক না হলে ভুল কোড করা এত সহজ। অগ্রভাগে চালানোর জন্য আপনার প্রক্রিয়াটি লেখার পক্ষে আরও ভাল, এবং ফোর্কিং বয়লারপ্লেট পরিচালনা করতে একটি সিস্টেমের পটভূমি টাস্ক ম্যানেজার ( systemd, upstart) বা অন্যান্য ইউটিলিটি ( daemon(1)) ব্যবহার করুন ।
লুক্রেটিয়েল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.