আমি যখন পুটি বন্ধ করি তখন কীভাবে পাইথন স্ক্রিপ্টটি চলতে হয়


19

আমি ভিপিএস-এ উবুন্টুতে একটি অজগর স্ক্রিপ্টটি চালাচ্ছি। এটি মেশিন লার্নিং প্রশিক্ষণ প্রক্রিয়া তাই প্রশিক্ষণে প্রচুর সময় নিন। কীভাবে আমি এই প্রক্রিয়াটি না থামিয়ে পুটি বন্ধ করতে পারি।


1
চেক আউট nohup
পিএইচকে

উত্তর:


37

আপনার দুটি প্রধান পছন্দ রয়েছে:

  1. কমান্ডটি দিয়ে রান করুন nohup। এটি এটি আপনার সেশন থেকে আলাদা করে দেবে এবং আপনার সংযোগ বিচ্ছিন্ন করার পরে এটি চালিয়ে যেতে দেবে:

    nohup pythonScript.py

    নোট করুন যে কমান্ডের stdout একটি ফাইলের সাথে যুক্ত করা হবে nohup.outযদি না আপনি এটি পুনঃনির্দেশ করেন ( nohup pythonScript.py > outfile)।

  2. মত একটি স্ক্রিন মাল্টিপ্লেক্সার ব্যবহার করুন tmux। এটি আপনাকে রিমোট মেশিন থেকে সংযোগ বিচ্ছিন্ন করতে দেবে কিন্তু এরপরে, আপনি যখন tmux attachআবার সংযোগ করবেন, আপনি আবার দৌড়ালে , আপনি ঠিক একই সেশনে নিজেকে খুঁজে পাবেন। কমান্ডটি এখনও চলমান থাকবে (আপনি লগ আউট করার সময় এটি চলতে থাকবে) এবং আপনি এর স্টাডআউট এবং স্টাডারকে ঠিক এমনভাবে দেখতে সক্ষম হবেন যেমন আপনি কখনই লগ আউট করেন নি:

    tmux 
    pythonScript.py

    একবার আপনি এটি চালু করার পরে, কেবল পটিটিওয়াই উইন্ডোটি বন্ধ করুন। তারপরে, পরের দিন আবার সংযোগ করুন, আবার দৌড়াবেন tmux attachএবং আপনি যেখানে ফিরে এসেছেন সেখানে ফিরে আসুন।


4
1 এবং 2 এর বিকল্প: 1. disown2.screen
হিমাইল

এটি উল্লেখযোগ্যও হতে পারে byobu, tmux বা পর্দার চারপাশে একটি মোড়ক।
bli

2

screenটুল, সব লিনাক্স ডিস্ট্রো জন্য উপলব্ধ, এই সমর্থন করে।

এটি ইনস্টল করার জন্য, চালানোর apt-get install screenদেবের ভিত্তিক লিনাক্স ডিস্ট্রো, অথবা dnf install -y screenবা yum install -y screenআরপিএম-ভিত্তিক বেশী জন্য।

ব্যবহার করা:

$ screen

একটি নতুন শেল শুরু হয়েছে। এই শেলটিতে, আপনি আপনার পাইথন স্ক্রিপ্ট শুরু করতে পারেন। তারপর আপনি টিপতে পারেন Ctrl+ + Shift+ + Aতারপর D। এটি আপনার স্ক্রিপ্টটি চালাচ্ছে এমন শেল থেকে আপনার টার্মিনালটিকে আলাদা করবে। তদ্ব্যতীত, স্ক্রিপ্টটি এখনও এতে চলছে।

আপনার স্ক্রিপ্টটি কীভাবে চলছে তা দেখতে আপনি কল করতে পারেন screen -r। এটি ব্যাকগ্রাউন্ডে আপনি যে পাইথন স্ক্রিপ্টটি রেখে গেছেন তাতে শেলটিতে আপনার টার্মিনালটিকে পুনরায় যুক্ত করবে।

ইউপিডি: ফক্স যেমন উল্লেখ করেছে, স্ক্রিনটি সিস্টেমডের সাথে খারাপভাবে কাজ করে তবে আমরা স্ক্রিপ্ট শুরু করতে সিস্টেমড ব্যবহার করতে পারি, যেমন তারা সরকারী উদাহরণে বলেছিল ।

উদাহরণস্বরূপ, যদি আপনার স্ক্রিপ্টটি দিয়ে শুরু করা হয় /usr/bin/myPythonScript, আপনি এর মতো সিস্টেমড ইউনিট ফাইল তৈরি করতে পারেন।

$ cat /etc/systemd/system/myPythonScript.service

[Unit]
Description=MyPythonScript

[Service]
ExecStart=/usr/bin/myPythonScript

[Install]
WantedBy=multi-user.target

চেয়ে, আপনি এই স্ক্রিপ্টটি শুরু করতে পারেন # systemctl daemon-reload # systemctl start myPythonScript

আপনি যদি এই স্ক্রিপ্টটি সিস্টেমের শুরুতে স্বয়ংক্রিয়ভাবে শুরু করতে চান -

# systemctl enable myPythonScript

যে কোনও সময় আপনি দেখতে পারেন যে কীভাবে আপনার স্ক্রিপ্ট চলছে

# systemctl status myPythonScript

বিজ্ঞাপন আপনি আপনার স্ক্রিপ্ট লগ পর্যালোচনা করতে পারেন

# journalctl -u myPythonScript -e


নোট করুন যে এটির ডিফল্ট কনফিগারেশনে screenসঠিকভাবে খেলছে না systemd। উবুন্টু ব্যবহার করে কিনা তা আমি জানি না systemd, তবে আচরণ এবং কাজটি আপনার উত্তরে উল্লেখযোগ্য হতে পারে
ফক্স

1

বেশিরভাগ প্রক্রিয়াগুলি তার স্টাডাউট, স্ট্ডার, স্ট্ডিনকে পুনর্নির্দেশের মাধ্যমে বোকা বানানো যেতে পারে (সমস্ত বর্ণনাকারী পুনরায় পুনর্নির্দেশের জন্য প্রয়োজনীয় নয়) এবং &নিয়ন্ত্রণ অপারেটর ব্যবহার করে ।

যে ping example.com 1>/dev/null &কাজ করে দেখুন ।

অবশ্যই, কিছু প্রোগ্রামগুলি আরও পরিশীলিত এবং @terdon হিসাবে উল্লিখিত যেমন সমাধানগুলির প্রয়োজন হয় তবে এটি ভাল এবং কী উপযুক্ত তা জেনে এবং ব্যবহার করা ভাল।

সম্পাদনা: এই উত্তরে লিখিতভাবে systemdলগআউট করার প্রক্রিয়াগুলিকে হত্যা করে। systemdডিফল্টরূপে লগআউটে কিল প্রসেসের কিছু সংস্করণ থাকে , অন্যরা তা করে না। নীচের বিকল্পটি সেট করে /etc/systemd/logind.conf পরিবর্তন করে এই আচরণটি পরিবর্তন করা যেতে পারে। লিখিত হিসাবে, এটি @ টেরডনের সমাধানগুলির সাথে আপনার কিছু সমস্যা সমাধান করতে পারে।

থেকে man logind.conf:

KillUserProcesses=

একটি বুলিয়ান যুক্তি দেয় T ব্যবহারকারী লগ আউট করার সময় কোনও ব্যবহারকারীর প্রক্রিয়াগুলি হত্যা করা উচিত কিনা তা কনফিগার করে। যদি সত্য হয়, সেশনের সাথে সম্পর্কিত স্কোপ ইউনিট এবং সেই সুযোগের অভ্যন্তরের সমস্ত প্রক্রিয়া সমাপ্ত হবে। মিথ্যা হলে, সুযোগটি "পরিত্যাজ্য", systemd.scope (5) দেখুন এবং প্রক্রিয়াগুলি হত্যা করা হয় না। "হ্যাঁ" এ ডিফল্ট, তবে বিকল্পগুলি KillOnlyUsers=এবং KillExcludeUsers=নীচে দেখুন।

সেশন প্রক্রিয়াগুলি ছাড়াও, ব্যবহারকারী প্রক্রিয়া ব্যবহারকারী পরিচালকের ইউনিট ব্যবহারকারী @ .service এর অধীনে চলতে পারে। লম্বা সেটিংসের উপর নির্ভর করে এটি ব্যবহারকারীদের তাদের লগইন সেশনগুলির চেয়ে আলাদা প্রক্রিয়া চালানোর অনুমতি দিতে পারে। বিবরণ দেখুন enable-lingerমধ্যে loginctl(1)।

নোট করুন যে সেটিংসটি (1) এবং (1) এর KillUserProcesses=yesমতো সরঞ্জামগুলি ভেঙে দেবে , যদি না সেগুলি সেশনের সুযোগের বাইরে চলে যায়। (1) উদাহরণ দেখুন ।screentmuxsystemd-run

আরও জানতে লিঙ্কিত উত্তর পড়ুন।


1
এটি কেবল প্রক্রিয়াকে প্রেক্ষাপটে প্রেরণ করে। ওপি একটি দূরবর্তী ssh অধিবেশন থেকে সংযোগ বিচ্ছিন্ন করতে এবং প্রক্রিয়াটি চালিয়ে যেতে চায়। এটি এই পরিস্থিতিতে সাহায্য করবে না, দূরবর্তী সেশন থেকে বেরিয়ে আসা পটভূমিতে থাকলেও কমান্ডটি বন্ধ করবে।
terdon

@ ইটারডন আপনি কি পরীক্ষা করে দেখেছেন যে আমার উদাহরণটি কাজ করে? আমি চেক করেছি এবং এটি কিছু জন্য কাজ করে আদেশের করে, যেমনটি আমি আমার উত্তরে লিখেছি।
স্টাইলরোম ফ্লাই 19

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

@ ইটারডন মজার, আমি এটি স্থানীয় আর্চলিনাক্স দূরবর্তী পিএলডি-তে সংযোগ স্থাপন করে দেখেছি। একমাত্র নিয়ম যা পুরো সময় কাজ করে তা হ'ল "প্রোগ্রামটি কি ব্যবহার করে isatty()এবং যদি তা না হয় তবে কি প্রস্থান হয়?"
স্টায়ারফোম ফ্লাই 19

এটি নিজস্ব প্রশ্নের যোগ্যতা হতে পারে। আমি জানি আমার সর্বদা নোহুপ দরকার ছিল এবং তারপরে কিছু সময়ে কিছু পরিবর্তিত হয়েছিল এবং আমি মাঝে মাঝে তাও করি না। আমি দেখতে পাচ্ছি না যে ইসটিটি এটি কীভাবে হতে পারে, আপনি যদি প্যারেন্ট শেল থেকে প্রস্থান করেন, তবে এটি শিশুটিকেও হত্যা করবে। তবে হ্যাঁ, কখনও কখনও তা হয় না। আমি অনুমান করছি এটি অবশ্যই কোনওভাবে কনফিগারযোগ্য হবে be
terdon
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.