নিয়ন্ত্রণকারী টার্মিনাল থেকে সংযোগ বিচ্ছিন্ন একটি আদেশ / স্ক্রিপ্ট চালু করবেন?


9

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

patchএটি অ-ইন্টারেক্টিভ মোটামুটি সহজ যে বোঝানো ; আমাকে কেবলমাত্র stdoutঅ-টিটিটি হিসাবে পুনঃনির্দেশ করা দরকার :

$ </dev/null > >(cat) /path/to/myscript --args

তবে svnএটি উপস্থিত থাকলে নিয়ন্ত্রণকারী টার্মিনালের সাথে সংযুক্ত হবে; স্ক্রিপ্টগুলি পাস করার জন্য সম্পাদনা করা --non-interactiveআসলেই কোনও বিকল্প নয় কারণ এটি বিভিন্ন স্তরের গভীর থেকে আগত এবং এটি নিশ্চিত হওয়া কঠিন যে আমি প্রতিটি অনুরোধটি পেয়েছি।

নিয়ন্ত্রণকারী টার্মিনাল ছাড়াই ( /dev/ttyকোনও অস্তিত্বের অস্তিত্ব নেই) বিনা ইন্টারেক্টিভভাবে কোনও স্ক্রিপ্ট / কমান্ড চাওয়ার কোনও উপায় আছে ? আমি এখনও আমার টার্মিনালে যেতে স্টাডাউট / স্টাডার পছন্দ করব।

(আমি একটি ইন্টারঅ্যাক্টিভ শেলটিতে রান স্ক্রিপ্ট প্রশ্নটি পেয়েছি ? তবে এর উত্তরগুলি ক্রোন এবং ব্যবহারকারীর পরিবেশের মধ্যে পার্থক্য নিয়ে আলোচনা করে; আমি ইতিমধ্যে আন্তঃআকটিভিটি বাদ দিয়ে সমস্ত পার্থক্য দূর করেছি))

উত্তর:


13

আপনাকে অন্য একটি সেশন শুরু করতে হবে যা টার্মিনালের সাথে সংযুক্ত নয়, উদাহরণস্বরূপ:

$ setsid sh -c 'tty; ps -jp "$$"; echo test' < /dev/null > log 2>&1
$ cat log
not a tty
  PID  PGID   SID TTY          TIME CMD
19506 19506 19506 ?        00:00:00 sh
test

start-stop-daemonকিছু লিনাক্স বিতরণে প্রাপ্ত কমান্ডটিও দেখুন । একটি daemonকমান্ডও আছে।


এই আউটপুট মানে কি? দেখতে খুব ক্রিপ্টিক লাগছে।
অ্যানাটোলি টেকটোনিক

2
@নাটোলিটেকটোনিকের গুরুত্বপূর্ণ অংশগুলি "টিটিটি নয়" যা স্টিডিনে ttyকোনও টার্মিনাল নেই এবং তা "নিশ্চিত করার ফলাফল রয়েছে ?" psআউটপুটটির টিটিওয়াই কলামে যা নিশ্চিত করে যে প্রক্রিয়াটির (এবং এর অধীনে চলমান কিছু) কোনও নিয়ন্ত্রণের জন্য নেই sh
মিঃ স্পুর্যাটিক

অন্যান্য কমান্ডের মতো কমান্ড চালাতে, ব্যবহার করুন setsid -w। উদাহরণ: setsid -w sh -c 'tty < /dev/tty'দেয় sh: 1: cannot open /dev/tty: No such device or address(দ্রষ্টব্য: /dev/ttyআপনার নিয়ন্ত্রণকারী টিটিআই)। -wসেটসাইড ছাড়াই সমান্তরাল / পটভূমিতে প্রক্রিয়াটি চালায়।
টিনো

0

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

/programming/609445/using-expect-to-login-into-svn


এটি কাজ করে না; ইন্টারেক্টিভভাবে রান কমান্ড প্রত্যাশা।
এ্যাক্যাটমুর

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

আসলে আমি এটিকে যত বেশি পড়ি, ততই আমি বুঝতে পারি যে আপনি যা যাচ্ছিলেন তা ভুল বুঝেছি। দুঃক্ষিত।
ব্র্যাচলে

0

কখনও কখনও আপনার স্টিডিন খোলা রাখতে হবে (স্টাডিনের উপর ইফ পেল না) (যেমন আশা করা)। সেক্ষেত্রে / dev / নাল থেকে / dev / শূন্যে পরিবর্তন করুন।

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