আপনার অনুমান যে এটি ssh
নিজেই 255 প্রস্থান স্থিতি ফিরে আসে। ssh
মানুষ যে পৃষ্ঠাটি বলে:
ssh রিমোট কমান্ডের প্রস্থান স্থিতি সহ অথবা কোনও ত্রুটি ঘটলে 255 দিয়ে প্রস্থান করে।
আপনি যদি সহজভাবে চালাতে ssh pi@10.20.0.10 "pkill -f asdf"
চান তবে আপনি সম্ভবত " কোনও প্রক্রিয়া মেলে না " 1
এর pkill
স্ট্যাটাসের সাথে মিল রেখে একটি প্রস্থান স্থিতি পেয়ে যাবেন ।
চ্যালেঞ্জিং অংশটি হ'ল বোঝা উচিত যে আপনি চালানোর সময় এসএসএইচ-তে কেন ত্রুটি ঘটে
ssh pi@10.20.0.10 "pkill -f asdf || true"
এসএসএইচ দূরবর্তী কমান্ড
এসএসএইচ সার্ভার রিমোট কমান্ড (গুলি) চালানোর জন্য একটি শেল প্রবর্তন করে। এখানে কর্মের একটি উদাহরণ এখানে:
$ ssh server "ps -elf | tail -5"
4 S root 35323 1024 12 80 0 - 43170 poll_s 12:01 ? 00:00:00 sshd: anthony [priv]
5 S anthony 35329 35323 0 80 0 - 43170 poll_s 12:01 ? 00:00:00 sshd: anthony@notty
0 S anthony 35330 35329 0 80 0 - 28283 do_wai 12:01 ? 00:00:00 bash -c ps -elf | tail -5
0 R anthony 35341 35330 0 80 0 - 40340 - 12:01 ? 00:00:00 ps -elf
0 S anthony 35342 35330 0 80 0 - 26985 pipe_w 12:01 ? 00:00:00 tail -5
লক্ষ্য করুন যে ডিফল্ট শেলটি হ'ল bash
এবং দূরবর্তী কমান্ডটি একটি সাধারণ কমান্ড নয় বরং একটি পাইপলাইন , "নিয়ন্ত্রণ অপারেটর দ্বারা বিভক্ত এক বা একাধিক কমান্ডের অনুক্রম |
"।
বাশ শেলটি উপলব্ধি করার জন্য যথেষ্ট চালাক যে -c
বিকল্পটি দ্বারা কমান্ডটি একটি সরল কমান্ড হিসাবে প্রেরণ করা হলে এটি একটি নতুন প্রক্রিয়াটি প্রকৃতপক্ষে নকল না করে অনুকূলিত করতে পারে, exec
অতিরিক্ত পদক্ষেপের পরিবর্তে এটি সরাসরি সরল কমান্ডটি ব্যবহার করে এর fork
ing আগেই exec
s। আপনি যখন রিমোট সিম্পল কমান্ডটি চালান তখন কী ঘটে তার উদাহরণ এখানে দেওয়া হয়েছে ps -elf
:
$ ssh server "ps -elf" | tail -5
1 S root 34740 2 0 80 0 - 0 worker 11:49 ? 00:00:00 [kworker/0:1]
1 S root 34762 2 0 80 0 - 0 worker 11:50 ? 00:00:00 [kworker/0:3]
4 S root 34824 1024 31 80 0 - 43170 poll_s 11:51 ? 00:00:00 sshd: anthony [priv]
5 S anthony 34829 34824 0 80 0 - 43170 poll_s 11:51 ? 00:00:00 sshd: anthony@notty
0 R anthony 34830 34829 0 80 0 - 40340 - 11:51 ? 00:00:00 ps -elf
আমি এর আগে এই আচরণটি পেরিয়ে এসেছি তবে আমি এই আস্কউবুন্টু উত্তর ছাড়া আর কোনও ভাল রেফারেন্স পাই না ।
পিকিল আচরণ
যেহেতু pkill -f asdf || true
কোনও সরল কমান্ড নয় (এটি একটি কমান্ডের তালিকা ), উপরের অপ্টিমাইজেশনটি এমনভাবে ঘটতে পারে না যখন আপনি চালাবেন ssh pi@10.20.0.10 "pkill -f asdf || true"
, sshd
প্রক্রিয়াটি কাঁটাচামচ করে এবং সম্পাদন করে bash -c "pkill -f asdf || true"
।
সিটিএক্সের উত্তরটি যেমন উল্লেখ করেছে, pkill
এটি নিজস্ব প্রক্রিয়াটি হত্যা করবে না। যাইহোক, এটা হবে অন্য কোন প্রক্রিয়া যার কমান্ড লাইন মিলে যায় হত্যা -f
প্যাটার্ন। bash -c
নিজস্ব পিতা বা মাতা (যেমন ঘটনাচক্রে) - তাই এটি এই প্রক্রিয়া নিহত কমান্ড এই প্যাটার্ন মেলে।
এসএসএইচ সার্ভারটি দেখতে পাবে যে রিমোট কমান্ডগুলি চালানোর জন্য এটি শেল প্রক্রিয়াটি শুরু হয়েছিল অপ্রত্যাশিতভাবে নিহত হয়েছিল সুতরাং এটি এসএসএইচ ক্লায়েন্টকে একটি ত্রুটির খবর দেয়।
pkill
কারণ এটির ARG তালিকা regexp সাথে মিলে যায় তার পিতা বা মাতা শেল প্রক্রিয়া নষ্ট, আমি একটি পরিভাষা আপত্তি বাড়াতে হবে:x || y
হয় না একটি যৌগ কমান্ড , এটি একটি এর কমান্ড তালিকা ।