আমি কীভাবে একটি কমান্ড চালাতে পারি যা টার্মিনাল বন্ধে বাঁচতে পারে?


313

কখনও কখনও আমি একটি প্রক্রিয়া শুরু করতে এবং এটি ভুলে যেতে চাই। যদি আমি কমান্ড লাইন থেকে এটি শুরু করি তবে:

redshift

আমি টার্মিনালটি বন্ধ করতে পারি না, বা এটি প্রক্রিয়াটি হারাবে। আমি কি কোনও কমান্ডটি এমনভাবে চালাতে পারি যে প্রক্রিয়াটি না মেরে আমি টার্মিনালটি বন্ধ করতে পারি?


4
সমস্ত ডিস্ট্রোজে ডিফল্ট ইনস্টল নয়, তবে স্ক্রিনটি আপনার বন্ধু: en.wikedia.org/wiki/GNU_Screen
জায়েন এস হালসাল

একই সমস্যার মুখোমুখি যে কারও কাছে: মনে রাখবেন যে, আপনি টাইপ করলেও yourExecutable &এবং ফলাফলগুলি পর্দায় আসতে থাকে এবং Ctrl+Cকোনও কিছু থামায় বলে মনে হয় না, কেবল অন্ধভাবে টাইপ করে disown;চাপুন Enterএমনকি পর্দা আউটপুটগুলির সাথে স্ক্রোল করছে এবং আপনি কী দেখতে পাচ্ছেন না আপনি টাইপ করছেন প্রক্রিয়াটি অস্বীকার হয়ে যাবে এবং আপনি প্রক্রিয়াটি মারা যাওয়া ছাড়াই টার্মিনালটি বন্ধ করতে সক্ষম হবেন।
নাভ

স্ক্রীনের মাল্টিপ্লেক্সার যেমন ব্যবহার করতে পারেন tmux । এটি উবুন্টু মেশিনগুলিতে
হিমাংশু

উত্তর:


311

নিম্নলিখিত 2 টির মধ্যে একটিতে কাজ করা উচিত:

$ nohup redshift &

অথবা

$ redshift &
$ disown

এটি কীভাবে কাজ করে তার জন্য আরও কিছু তথ্যের জন্য নিম্নলিখিতটি দেখুন:


5
দ্বিতীয়টি ( redshift & disown) উবুন্টু ১০.১০ এ আমার জন্য কাজ করেছিল। এটি সমস্ত এক লাইনে রেখে দুর্দান্ত কাজ করছে বলে মনে হচ্ছে। আমার কি করা উচিত নয় এমন কোনও কারণ আছে?
ম্যাথু

4
@ ম্যাথজে প্রথমটিও ঠিকঠাক কাজ করা উচিত, এটি দ্বিতীয়টির মতো ব্যাকগ্রাউন্ড করে না (আপনি সম্ভবত nohup redshift &এটি চান এটি এটি পটভূমি করে)) এবং দ্বিতীয়টি এক লাইনে রাখা ভাল, যদিও আপনি সাধারণত ;( redshift &; disown) এর সাথে পৃথক হন
মাইকেল মরোজেক

10
@ মিশেল: উভয়ই ;এবং &কমান্ড বিভাজক এবং সমান নজরে রয়েছে। একমাত্র পার্থক্য হ'ল সিঙ্ক্রোনাস বনাম অ্যাসিনক্রোনাস এক্সিকিউশন (যথাক্রমে)। &;শুধু &(এটি কাজ করে তবে এটি কিছুটা অপ্রয়োজনীয়) এর পক্ষে অগ্রাধিকার হিসাবে ব্যবহার করার দরকার নেই ।
ক্রিস জনসেন

4
ভাল উত্তর, কেউ যুক্ত করতে পারে যে স্টাডাউট এবং স্টডারকে পুনর্নির্দেশ করা ভাল ধারণা হবে যাতে টার্মিনালটি ডিবাগ আউটপুট দিয়ে স্প্যাম না হয়ে যায়
কিম

12
এছাড়াও, redshift &!তাত্ক্ষণিকভাবে redshift অস্বীকার করবে।

143

যদি আপনার প্রোগ্রামটি ইতিমধ্যে চলমান থাকে তবে আপনি এটিকে থামিয়ে দিতে পারেন Ctrl-Z, এটির সাথে ব্যাকগ্রাউন্ডে এ টানুন bgএবং এর পরে disown:

$ sleep 1000
^Z
[1]+  Stopped                 sleep 1000
$ bg
$ disown
$ exit

3
অস্বীকার করার পরে আমি কীভাবে আবার চলমান প্রক্রিয়াটির স্টাডআউট পড়তে পারি?
নেকেটভি 22'14


1
এটি আমার জন্য কোনও কারণে (সেন্টো) কাজ করে নি
ইয়ান

এই পদ্ধতির পরে প্রক্রিয়াটি কীভাবে হত্যা করা যায়?
পলক দারজি

2
@ নেকেতভি স্টডআউট disownবা স্টডারকে সংযোগ বিচ্ছিন্ন করে না। যাইহোক nohup, হিসাবে >/dev/null(স্ট্যান্ডার্ড আউট সংযোগ বিচ্ছিন্ন), 2>/dev/null(স্ট্যান্ডার্ড ত্রুটি সংযোগ বিচ্ছিন্ন)। এটি ( disown) কাজ-নিয়ন্ত্রণকে সংযোগ বিচ্ছিন্ন করে।
ctrl-alt-delor

45

ভাল উত্তর ইতিমধ্যে @ স্টেভেনডি পোস্ট করেছে, তবুও আমি মনে করি এটি সম্ভবত এটি আরও কিছুটা পরিষ্কার করে দেবে।

প্রক্রিয়াটি টার্মিনালের সমাপ্তির সময় নিহত হওয়ার কারণটি হ'ল আপনি যে প্রক্রিয়াটি শুরু করেন তা হ'ল টার্মিনালের একটি শিশু প্রক্রিয়া। একবার আপনি টার্মিনালটি বন্ধ করে দিলে, এটি এই শিশু প্রক্রিয়াগুলিকে পাশাপাশি হত্যা করবে। আপনি প্রক্রিয়া গাছটি দেখতে পাবেন pstreeউদাহরণস্বরূপ kate &কনসোলে চলার সময় :

init-+
     ├─konsole─┬─bash─┬─kate───2*[{kate}]
     │         │      └─pstree
     │         └─2*[{konsole}]

kateপ্রক্রিয়াটি konsoleসমাপ্ত হওয়ার সময় থেকে আলাদা করতে konsole, nohupকমান্ডটি ব্যবহার করুন, এটির মতো:

nohup kate &

বন্ধ করার পরে konsole, pstreeএটি দেখতে পাবেন:

init-+
     |-kate---2*[{kate}]

এবং kateবেঁচে থাকবে। :)

একটি বিকল্প ব্যবহার করছে screen/ tmux/ byobu, যা শেলটি চলমান রাখবে, টার্মিনালের থেকে পৃথক।


অস্বীকার পদ্ধতিগুলিতে আমার সমস্যা ছিল। এটি বর্তমানে আমার পক্ষে কাজ করছে, তাই উজ্জীবিত। আমি এটিও পছন্দ করি কারণ আমি কী ঘটছে তা দেখতে nohup.out লেজ করতে পারি, তবে আমার অধিবেশন ব্যর্থ হওয়ার বিষয়ে চিন্তা করবেন না
ইয়ান

27

আপনি টার্মিনালে এই পদ্ধতিটি চালাতে পারেন

setsid process

এটি একটি নতুন অধিবেশনটিতে প্রোগ্রামটি পরিচালনা করবে। যেমন ব্যাখ্যা করা হয়েছে http://hanoo.org/index.php?article=run-program-in-new-session-linux


1
নোহাপ ওভার সেটের সুবিধাগুলি হিসাবে আপনি কী দেখছেন?
ব্রুস

1
1) এটি সম্পর্কে একটি বিরক্তিকর বার্তা মুদ্রণ করে না nohup.out। 2) এটি আপনার শেলের কাজের তালিকায় থাকে না, সুতরাং এটির আউটপুটটি বিশৃঙ্খলা করে না jobs
মাইকেল

এটিই একমাত্র সমাধান যা স্ক্রিপ্টের সাথে কাজ করে যা lxterminal এ চলে, pcmanfm আর প্রস্থান শুরু করে (pcmanfm চলমান থাকাকালীন সেটড টার্মিনালটি বন্ধ হয়ে যেতে পারে) দিয়ে। তোমাকে অনেক ধন্যবাদ!
দেশগুয়া

9

যদিও সমস্ত প্রস্তাবনাগুলি ভালভাবে কাজ করে, আমি খুঁজে পেয়েছি আমার বিকল্পটি ব্যবহার করা screen, এমন একটি প্রোগ্রাম যা আপনার স্ক্রিনে ভার্চুয়াল টার্মিনাল সেট করে।

আপনি এটি দিয়ে শুরু বিবেচনা করতে পারেন । স্ক্রিনটি কার্যত সমস্ত লিনাক্স এবং ইউনিক্স ডেরিভেটিভসে ইনস্টল করা যেতে পারে। হিট + এবং (লোয়ার কেস) দ্বিতীয় সেশন শুরু করবে। এই আপনি আগে পিছে প্রাথমিক অধিবেশন মধ্যে চাপার দ্বারা টগল করার জন্য সম্ভব হবে + + এবং চাপার দ্বারা অথবা ঊর্ধ্বতন সংস্করণ অধিবেশন + + এবং । আপনার এক টার্মিনালে দশটি পর্যন্ত সেশন থাকতে পারে। আমি কর্মক্ষেত্রে একটি সেশন শুরু করতাম, বাড়িতে যাইতাম, আমার ওয়ার্ক মেশিনে প্রবেশ করতাম এবং তারপরে অনুরোধ করতাম । এটি আপনাকে সেই দূরবর্তী সেশনে পুনরায় সংযুক্ত করবে।screen -S session_nameCtrlACCtrlA0CtrlA1screen -d -R session_name


screen -d -m commandএটি ইতিমধ্যে বিচ্ছিন্ন স্ক্রিনের মধ্যেই শুরু করবে: ~# screen -d -m top ~# screen -ls There is a screen on: 10803..Server-station (Detached) 1 Socket in /root/.screen. ~# screen -x .... এবং আপনি ভিতরে আছেন
ডাঃ আলেকজান্ডার

7

এই সমস্ত কিছু করার শেল-একমাত্র উপায় হ'ল স্টিডিনটি বন্ধ করা এবং কমান্ডটি ব্যাকগ্রাউন্ড করা:

command <&- & 

তারপরে আপনি শেলটি ছাড়লে এটি ছাড়বে না। পুনর্নির্দেশ stdout করা একটি দুর্দান্ত alচ্ছিক জিনিস।

অসুবিধা হ'ল সত্যের পরে আপনি এটি করতে পারবেন না।


আমি উবুন্টুতে চেষ্টা করেছি। খুনের টার্মিনালটিও চালু হওয়া প্রক্রিয়াটি বন্ধ করে দিয়েছে। কেন এটি হতে পারে সম্পর্কে কোনও ধারণা?
অশোক কোয়ি

7

আমার কাছে একটি স্ক্রিপ্ট রয়েছে:

  • পটভূমিতে নির্বিচারে কমান্ড চালান

  • টার্মিনাল উইন্ডো দিয়ে তাদের হত্যা করা থেকে বিরত করুন

  • তাদের আউটপুট দমন

  • প্রস্থান স্থিতি পরিচালনা করে

আমি মূলত এটা জন্য ব্যবহার gedit, evince, inkscapeইত্যাদি সব বিরক্তিকর টার্মিনাল আউটপুট প্রচুর আছে। কমান্ডটি আগে শেষ হলে TIMEOUTনোহুপের প্রস্থান স্থিতি শূন্যের পরিবর্তে ফিরে আসে।

#!/bin/bash

TIMEOUT=0.1

#use nohup to run the command, suppressing its output and allowing the terminal to be closed
#also send nohup's output to /dev/null, supressing nohup.out
#run nohup in the background so this script doesn't block
nohup "${@}" >/dev/null 2>&1 &
NOHUP_PID=$!

#kill this script after a short time, exiting with success status - command is still running
#this is needed as there is no timeout argument for `wait` below
MY_PID=$$
trap "exit 0" SIGINT SIGTERM
sleep $TIMEOUT && kill $MY_PID 2>/dev/null & #ignore "No such process" error if this exits normally

#if the command finishes before the above timeout, everything may be just fine or there could have been an error
wait $NOHUP_PID
NOHUP_STATUS=$?
#print an error if there was any. most commonly, there was a typo in the command
[ $NOHUP_STATUS != 0 ] && echo "Error ${@}"
#return the exit status of nohup, whatever it was
exit $NOHUP_STATUS

উদাহরণ ...

>>> run true && echo success || echo fail
success
>>> run false && echo success || echo fail
Error false
fail
>>> run sleep 1000 && echo success || echo fail
success
>>> run notfound && echo success || echo fail
Error notfound
fail

6

আমি পছন্দ করি:

(আবেদনের নাম &)

উদাহরণ স্বরূপ: linux@linux-desktop:~$ (chromium-browser &)

কমান্ডটি টাইপ করার সময় বন্ধনী ব্যবহার করার বিষয়টি নিশ্চিত করুন!


1
টার্মিনালটি বন্ধ করার ফলে প্রক্রিয়াটি
হ্রাস

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

আমার জন্য কাজ করুন, tnx
নোদেব

আমি আরও ভাবছি কেন এটি আরও উত্সাহ পেল না। nohupযে কোনও টাইটি আউটপুটকে বাধা দেয় এবং আমি আসলে আউটপুটটিকে কোনও ফাইলে পুনর্নির্দেশ করতে চেয়েছিলাম এবং এটি আমার পক্ষে আরও ভাল সমাধান হ'ল এটি আটকায়।
redanimalwar

4

লগ আউট এবং টার্মিনাল সেশনটি বন্ধ করার পরে আপনি কোনও এইচপি সংকেত না পাওয়ার জন্য একটি প্রক্রিয়া (পিআইডি) সেট করতে পারেন। নিম্নলিখিত কমান্ডটি ব্যবহার করুন:

nohup -p PID

3

আপলিনস্কির দেওয়া উত্তরের সাথে যুক্তিযুক্তভাবে অনুরূপ , আমি একটি বৈকল্পিক ব্যবহার করি screen। ভ্যানিলা কমান্ডটি এরকম

screen bash -c 'long_running_command_here; echo; read -p "ALL DONE:"'

সেশনটি এর সাথে সংযোগ বিচ্ছিন্ন করা যেতে পারে Ctrl ACtrl Dএবং এর সাথে সহজ ক্ষেত্রে সংযোগ স্থাপন করতে পারে screen -r। আমি এটিকে একটি স্ক্রিপ্টে আবৃত করেছি যাতে সুবিধাজনক অ্যাক্সেসের জন্য sessionআমার PATHপ্রস্তুত থাকে:

#!/bin/bash
#
if screen -ls | awk '$1 ~ /^[1-9][0-9]*\.'"$1"'/' >/dev/null
then
    echo "WARNING: session is already running (reattach with 'screen -r $1')" >&2
else
    exec screen -S "$1" bash -c "$@; echo; echo '--------------------'; read -p 'ALL DONE (Enter to exit):'"
    echo "ERROR: 'screen' is not installed on this system" >&2
fi
exit 1

এটি কেবল তখনই কাজ করে যখন আপনি আগে থেকেই জানবেন আপনি কোনও প্রোগ্রাম সংযোগ বিচ্ছিন্ন করতে চান। এটি ইতিমধ্যে চলমান প্রোগ্রামটি সংযোগ বিচ্ছিন্ন করার জন্য সরবরাহ করে না ।


2

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

  1. প্রক্রিয়া স্থগিত করুন
  2. পটভূমিতে প্রক্রিয়াটি আবার শুরু করুন
  3. প্রক্রিয়াটি অস্বীকার করুন
  4. স্ক্রিন সেশন চালু করুন
  5. প্রক্রিয়াটির পিআইডি সন্ধান করুন
  6. প্রক্রিয়াটি ধরে নিতে reptyr ব্যবহার করুন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.