ssh এবং ssh এর মাধ্যমে শেল: কীভাবে প্রস্থান করবেন?


22

আমি এসএসএইচের মাধ্যমে একটি দূর স্ক্রিপ্ট চালু করছি:

ssh user@ipaddress '~/my_script.sh'

সবকিছু ঠিকঠাক চলছে তবে একবার স্ক্রিপ্ট শেষ হয়ে গেলে সংযোগটি বন্ধ হয় না। বর্তমান সংযোগটি ভাঙ্গতে আমাকে সিটিআরএল-সি টিপতে হবে।

আমি 'exit / my_script.sh' এ "প্রস্থান" কমান্ড চেষ্টা করেছি এবং এটি অকেজো। আমি 'log / my_script.sh' এ "লগআউট" কমান্ড চেষ্টা করেছি এবং আমি একটি বার্তা পেয়েছি:

logout: not login shell: use exit

...

স্ক্রিপ্টটি শেষ হয়ে গেলে আমি কীভাবে স্বয়ংক্রিয়ভাবে এবং সঠিকভাবে এসএসএইচ বন্ধ করতে পারি?

(স্পষ্টকরণের জন্য পরিবর্তন :) এখানে আমার স্ক্রিপ্টের ভিতরে কী রয়েছে:

#!/bin/sh
path_sources_qas=/sources/QuickAddress/
path_qas_bin=/usr/bin/qas

umount_disque_qas()
{
  # Umount du disque 'qas' s'il n'avait pas été 'umount' :
  nom_disque_monte=`cat /etc/mtab | grep qas | awk '{ print $2}'`
  if [ "$nom_disque_monte" != "" ]
  then
    echo "For safety, umount : $nom_disque_monte"
    umount $nom_disque_monte
  fi

}

# Umount twice (we never know if a st***d guy mounted it twice) :
umount_disque_qas
umount_disque_qas

echo "--------------------------------"
echo "Install ISO quick address..."
nom_fichier_iso=`ls -t $path_sources_qas | awk '{if (NR==1) {print $1}}'`
echo "Mount disk $nom_fichier_iso..."
mount -o loop -t iso9660 $path_sources_qas/$nom_fichier_iso /mnt/qas
echo "Done."

# All the folders are like this :
# /usr/bin/qas/Data.old.10
# /usr/bin/qas/Data.old.11
# /usr/bin/qas/Data.old.12
# ...

echo "--------------------------------"
echo "Stopping QuickAdress server..."
cd $path_qas_bin/apps/
./wvmgmtd shutdown qaserver:2021
sleep 3
echo "Done."

# Get last number of the folder:
num_dernier_dossier_backup=`ls -Atd $path_qas_bin/Data.old* | awk '{if (NR==1) {print $1}}' | awk -F . '{print $NF}'`
# Add 1 :
let "num_dernier_dossier_backup += 1"
# Full name :
nom_dossier_backup=Data.old.$num_dernier_dossier_backup
echo "--------------------------------"
echo "Saving Data to $nom_dossier_backup..."
cd $path_qas_bin
mv Data $nom_dossier_backup
echo "Done."


echo "--------------------------------"
echo "Copying new folder Data..."
cd $path_qas_bin
cp -r /mnt/qas/Data .
echo "Done."

echo "--------------------------------"
echo "Deleting unused datas..."
cd $path_qas_bin/apps/
rm -f $path_qas_bin/Data/frxmos.dap
echo "Done."

echo "--------------------------------"
echo "Restart server..."
cd $path_qas_bin/apps/
./qaswvd &
sleep 3
echo "Done."
sleep 3

echo "--------------------------------"
echo "Check: server state: you should read 'OK':"
./wvmgmtd srvlist
echo "Done."

echo "--------------------------------"
echo "Check: active licences (only one here):"
./wvmgmtd licencelistread qaserver:2021
echo "Done."

echo "--------------------------------"
echo "Check: counters: number of addresses left:"
./wvmgmtd counterinforead qaserver:2021
echo "Done."

echo "--------------------------------"
echo "Check: Datasets avalaibles:"
./wvmgmtd datalistread current qaserver:2021
echo "Done."

echo "--------------------------------"
echo "Check: "meters" for "licence by click":"
./wvmgmtd meterslistread current qaserver:2021
echo "Done."

echo "--------------------------------"
echo "Removing virtual disk..."
umount_disque_qas
echo "Done."

echo "All done"
echo "Click 'Ctrl-C' to quit."

exit

আমি যখন এটি এসএসএইচ এর মাধ্যমে চালু করি তখন এটি চলে এবং শেষে, আমি "সমস্ত সম্পন্ন" পড়েছি সুতরাং এর অর্থ এটি শেষ 2 লাইনে পৌঁছেছে

কোনও ধারণা আমি কীভাবে স্বয়ংক্রিয়ভাবে বন্ধ করতে এবং PR করতে পারি



@ অলিভিয়ার: আপনি কোনও বন্দর ফরওয়ার্ড করেন (এজেন্ট এবং এক্স সহ)? কমান্ডটি শেষ হয়ে গেলে এবং সমস্ত টিসিপি সংযোগ বন্ধ হয়ে গেলে ssh সংযোগটি বন্ধ থাকে।
গিলস 'তাই খারাপ হওয়া বন্ধ করুন'

@ গিলস: না, আমি স্ক্রিপ্টটি চালানোর জন্য কেবল শেল সংযোগ করি, কিছুই এগিয়ে যায় না।
অলিভিয়ার পন্স

1
@ অলিভিয়ার: আপনার যদি একটি থাকে তবে ~/.ssh/configতা ছাড়া চেষ্টা করুন -a -xএবং কোনও ফরোয়ার্ডিং চলছে না তা নিশ্চিত করার জন্য বিকল্পগুলি (এবং না -o) পাস sshকরুন। যদি এটি এখনও কাজ না করে তবে স্ক্রিপ্টের বিষয়বস্তুগুলি দেখান।
গিলস 'তাই খারাপ হওয়া বন্ধ করুন'

@ অলিভিয়ার: স্ক্রিপ্টটি অপেক্ষা করা হতে পারে এমন কোনও পটভূমি কাজ শুরু করে? দুর্ভাগ্যক্রমে চাকরিগুলি কোনও এসএস স্ক্রিপ্টে থাকা অবস্থায় কিছু ফেরত আসবে বলে মনে হয় না। উদাহরণ: ssh <yourusername>@localhost '(ls; sleep 10 &); echo Done; jobs'ফাইলগুলি তালিকাবদ্ধ করবে, প্রদর্শন শেষ হবে এবং ফিরে আসার আগে 10 সেকেন্ড অপেক্ষা করবে।
asoundmove

উত্তর:


19

শেল স্ক্রিপ্টের প্রস্থানটি কাজ করে না কারণ এটি স্ক্রিপ্ট থেকে বের হচ্ছে, শেল নয়। স্ক্রিপ্টটি সম্পন্ন হওয়ার পরে শেল থেকে প্রস্থান করতে

ssh user@ipaddress '~/my_script.sh && exit'

এটি স্ক্রিপ্টটি চালাবে এবং তারপরে শেল থেকে প্রস্থান করবে।


3
এটি প্রস্থান করা উচিত। স্ক্রিপ্ট হয় শেল।
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

@ ডেনিস: এটি তার পক্ষে কাজ করছে না সুতরাং এটি পরিবর্তে কাজ করতে পারে।
ওফার্স 5'10

2
@জনাব. ম্যান: আপনার কমান্ডটি মূলটির সমতুল্য, এটি ছাড়া sshdশেলটি চলমান এবং শেলের মধ্যে চলতে বাধ্য করে myscript.shexitআপনি লিখেছেন যখন স্ক্রিপ্ট প্রস্থান করে, যা সাহায্য না কাজ করবে। আপনার সমাধানটি কার্যকর করার একমাত্র উপায় হ'ল যদি স্ক্রিপ্টটি যখন তার পিতামাতা থাকে তখন উদ্ভট কিছু sshdকরে এবং যখন তার পিতামাতার শেল থাকে তখন সেই উদ্ভট জিনিসটি না করে।
গিলস 'তাই খারাপ হওয়া বন্ধ করুন'

কিভাবে এটি সাহায্য করে না? প্রস্থান শেলটি বন্ধ করে সংযোগটি শেষ করবে, তাই না? এবং এটি কি পোস্টারটি করতে চায় না?
ওয়েফারস 5:51

3
@ মিঃ ম্যান: ~/my_script.sh && exitপ্রস্থান করার সাথে সাথেই ~/my_script.shবেরিয়ে আসে। শেল স্ক্রিপ্টটি যদি না বের হয় তবে আপনার কমান্ড আর exitযাইহোক কখনই বিটকে উঠবে না । সুতরাং এটি কেবল অকেজো।
গিলস 'তাই খারাপ হওয়া বন্ধ করুন'

12

Ssh দ্বারা প্রক্রিয়া শুরু হওয়ার পরে ssh সংযোগটি উন্মুক্ত থাকে (এখানে, একটি শেল) প্রস্থান করা হয়, যদি এখনও অন্য প্রক্রিয়াগুলি এটি ব্যবহার করে থাকে। আমি ssh ডিমন যে সঠিক নিয়ম অনুসরণ করে তা জানি না, তবে কোনও সংযোগ ব্যবহার করা হয়, কমপক্ষে, যদি কোনও শিশু প্রক্রিয়াটির স্ট্যান্ডার্ড আউটপুটটি এখনও এসএসএস দ্বারা সরবরাহিত মূল পাইপের সাথে সংযুক্ত থাকে। তুলনা করা:

ssh somehost 'sleep 5 &'  # exits after 5 seconds
ssh somehost 'sleep 5 >/dev/null &'  # exits immediately seconds

আপনি যখন কোনও ডেমন শুরু করেন, আপনার এটি ব্যাকগ্রাউন্ড করা উচিত এবং এর ফাইল বর্ণনাকারী বন্ধ করা উচিত। কমপক্ষে, এটি ব্যবহার করুন:

./qaswvd </dev/null >/dev/null 2>/dev/null &

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


একই সমস্যা ছিল এবং এটি কাজ করে। গৃহীত উত্তর কার্যকর হয় না।
অ্যান্ডি

5

আমি এই পোস্টটি দেখেছি যখন আমি একই পরিস্থিতির সমাধানের জন্য গুগল করেছিলাম। যদিও @ অলিভারের সমস্যা সমাধানে দেরি হচ্ছে, যেহেতু গ্রহণযোগ্য উত্তরটি স্পষ্টভাবে ওপি বা আমার সাথে কাজ করছে না (কেন এটি গ্রহণ করা হয়েছে তা জানি না), তবে আমি এখনও ভবিষ্যতের গুগলারের জন্য আমার নিজস্ব পোস্ট পোস্ট করতে চাই। এটি সহজ: কমান্ডে একটি -fবিকল্প যুক্ত করুন ssh:

ssh -f user@ipaddress '~/my_script.sh'

সম্পাদনা

-fবিকল্পের প্রভাবটি sshপটভূমিতে রাখা, সুতরাং কোনও বিকল্প যুক্ত না করেই সংযোগটি এখনও বেঁচে থাকার সম্ভাবনা রয়েছে এমনকি মনে হয় এটি ভেঙে গেছে। আগ্রহী হলে এই সাইটে অন্য পোস্টে দেওয়া উত্তরটি উল্লেখ করতে পারেন।


সতর্কতা: মূল স্ক্রিপ্টটিতে ব্যবহারকারী ইনপুটটির জন্য প্রম্পট (গুলি) দেওয়া থাকলে এটি (-f) কাজ করবে না।
madD7

3

ইগনাসিওর মতো আপনার স্ক্রিপ্টে কী আছে তা জানতে আগ্রহী।

সম্ভবত আপনি চেষ্টা করতে পারেন এবং আপনার স্ক্রিপ্টটিকে ক্ষুদ্রতম সম্ভাব্য উদাহরণে হ্রাস করতে পারেন যা ত্রুটির শর্ত তৈরি করে।

অথবা একটি খালি স্ক্রিপ্ট থেকে শুরু করুন এবং সমস্যাটি না হওয়া পর্যন্ত একটি সময়ে একটি কমান্ড যুক্ত করুন, তারপরে আপনি জানতে পারবেন কী কমান্ড আপনার স্ক্রিপ্টটিকে লকআপের কারণ করে।

খালি স্ক্রিপ্টটি যদি আপনার সমস্যার কারণ হয়ে থাকে তবে আপনি আপনার ssh কনফিগারেশনটি তদন্ত করতে চাইতে পারেন, উদাহরণস্বরূপ, .bash_logout বা প্রস্থানের সময় ডেকে আনা এমন কোনও সমস্যা যা সমস্যার কারণ হতে পারে?


আপনার পরামর্শের জন্য আপনাকে ধন্যবাদ, আমি এখন আমার প্রশ্নে আমার স্ক্রিপ্টের নমুনা যুক্ত করেছি।
অলিভিয়ার পন্স

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

@ গিলিস আপনাকে ধন্যবাদ। আমি আমার প্রশ্নটি পরিবর্তন করেছি এবং পুরো স্ক্রিপ্টটি যুক্ত করেছি। আশাকরি এটা সাহায্য করবে. দেখে মনে হচ্ছে যে সমস্যাটি হ'ল আমি ব্যাকগ্রাউন্ড প্রক্রিয়া চালু করছি ( লাইন "। / ক্যাসোভিডি এবং" )। এটি কি সমস্যার উত্স হতে পারে?
অলিভিয়ার পন্স

1
@ অলিভার: হ্যাঁ, আপনার মূল প্রক্রিয়াটি প্রস্থান করার আগে পটভূমি প্রক্রিয়াটি থামার জন্য অপেক্ষা করবে। প্রস্থান করার পরে যদি আপনি কিছু চালিয়ে যেতে চান তবে আপনি নোহাপ চেষ্টা করতে পারেন। যদিও এটি ssh এর সাথে কাজ করে তা নিশ্চিত নয়, তবে চেষ্টা করুন এটির ক্ষতি হবে না।

2

আপনি সম্ভবত আপনার স্ক্রিপ্টে কাজ ব্যবহার করতে পারেন। যদি এটি হয় তবে শেলটি আপনার কাজ শেষ হওয়ার জন্য অপেক্ষা করে এবং নিজেকে আলাদা করতে চায় না।

আমি পুনরায় পোস্ট করব না, কেবল আপনাকে ফরওয়ার্ড করব http://en.wikedia.org/wiki/Nohup#Existing_jobs


আমি আমার প্রশ্নটি পরিবর্তন করেছি এবং পুরো স্ক্রিপ্টটি যুক্ত করেছি। আশাকরি এটা সাহায্য করবে. দেখে মনে হচ্ছে যে সমস্যাটি হ'ল আমি ব্যাকগ্রাউন্ড প্রক্রিয়া চালু করছি (লাইন "। / ক্যাসোভিডি এবং")। আপনি যদি ঠিক থাকেন তবে এই সমস্যার মূল কারণ হতে পারে?
অলিভিয়ার পন্স

ব্যাকগ্রাউন্ড প্রক্রিয়াটি সমস্যা, তবে nohupসার্ভারের পাশে কোনও টার্মিনাল না থাকায় এটি সরাসরি এখানে সমস্যা নয়: আমি মনে করি অপরাধীটি বিশেষত খোলা ফাইলের বর্ণনাকারী।
গিলস 'অশুভ হওয়া বন্ধ করুন'

হ্যাঁ, আমি মনে করি এটিই সমস্যা, আপনি মন্তব্য করতে চেষ্টা করতে পারেন বা উপরের লিঙ্কটি থেকে হ্যাক প্রয়োগ করতে পারেন
ওলেকসী খিল্কেভিচ

1

আপনার স্ক্রিপ্টের মধ্যে থেকে আপনার পিতামাতার প্রক্রিয়াটি মেরে ফেলতে হবে।

kill -SIGHUP $PPID


0

সমস্যাটি সম্ভবত নিম্নলিখিত পংক্তিতে রয়েছে।

./qaswvd &

সম্ভবত এই কমান্ডটি এখনও চলছে এবং স্ট্ডিন এবং স্টাডআউট এবং স্টডার বন্ধ না হওয়া পর্যন্ত এসএসএস পাইপটি খোলা রাখবে।

পরিবর্তে এটি ব্যবহার করুন:

./qaswvd </dev/null >/dev/null 2>&1 &
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.