"কিল" নামক আমার স্ক্রিপ্টটি কেন ব্যর্থ হয়, তবে নাম পরিবর্তন করার পরে পুরোপুরি কার্যকর হয়?


12

প্রশ্নে স্ক্রিপ্টটি আমার লোকালহোস্ট পোর্ট ৮০৮০ এ সর্বশেষ প্রক্রিয়াটি সমাপ্ত করে।

#!/bin/bash
x=$(lsof -i:8080 | tail -1 | awk '{print $2}')
kill -9 $x

এটি কাজ করে না, যদি স্ক্রিপ্টটির নাম রাখা হয়েছিল 'কিল' (এটি পেয়েছেন? সর্বশেষ হত্যা করুন?)। এটি আমাকে cmdsubst> স্ক্রিপ্টটির নাম পরিবর্তন করে 'এসএসডিএফ' দেওয়ার জন্য একটি প্রম্পট দিয়েছে , সবকিছুই কাজ করে। এই আচরণের জন্য কি কোনও ব্যাখ্যা আছে? আমি ম্যাকস এল ক্যাপিটন ব্যবহার করছি।


5
আপনার কি অন্য কোনও ফাংশন আছে, নাম, ইউটিলিটি বা অন্য কমান্ড বলা হয় killl?
কুসালানন্দ

9
নামগুলি অস্পষ্ট করবেন না। killlভুল বানান হিসাবে ভুল ব্যাখ্যা করা যেতে পারে kill। : এটা স্পষ্ট এবং আরো বর্ণনামূলক হওয়াই বেশি ভাল kill_latestবা kill_last
cezar

6
type killlআপনি যে শেলটি শুরু করার চেষ্টা করেছিলেন সেখানে কী ফলাফল হয় ?
হউক লেগেছে

উত্তর:


27

cmdsubst>zshকমান্ড সাবস্টিটিউশন প্রবেশের শেষ হওয়ার অপেক্ষায় থাকা শেল দ্বারা মুদ্রিত দ্বিতীয়টি প্রম্পট ।

যদি আপনি কেবল প্রবেশের পরে প্রম্পটটি পান killl<Return>, তবে কেবলমাত্র যুক্তিসঙ্গত ব্যাখ্যাটি হ'ল আপনার একটি এলিফ রয়েছে (যা স্ট্রিং ম্যাক্রো এক্সপেনশনের কিছু রূপ) এর জন্য killlএমন কিছুতে প্রসারিত হয় যাতে একটি নির্বিঘ্নিত $(...)কমান্ড প্রতিস্থাপন থাকে, যেমন:

$ alias 'killl=echo $(lsof -ti'
$ killl :22
cmdsubst>

কোথায় zshযে বন্ধ করতে আপনি জিজ্ঞাসা করা হয় $(...)কমান্ড প্রতিকল্পন।

আরও কয়েকটি নোট:

  • এর আউটপুট lsofপিড অনুসারে বাছাই করা হয়। পিড নম্বর মোড়ানো হয়, বৃহত্তর পিডটি গ্যারান্টি নয় যে প্রক্রিয়াটি পরে শুরু হয়েছিল।
  • -i:8080 টিসিপি বা ইউডিপি সকেটগুলিকে উত্স বা গন্তব্য পোর্ট হিসাবে 8080 পোর্ট রয়েছে এমনটি শোনাবে, গ্রহণ করবে বা সকেট সংযোগ করবে কিনা তা রিপোর্ট করবে।
  • আপনি যদি পিডটি পেতে চান তবে আপনি এই -tবিকল্পটি ব্যবহার করতে পারেন lsof:lsof -ti:8080 | tail -n2
  • kill -9এটি হ'ল এটি kill -s KILLযা এমন সংকেত প্রেরণ করে যে অ্যাপ্লিকেশনটি নিখুঁতভাবে প্রস্থান করার জন্য কাজ করতে পারে না। এটি কেবল সর্বশেষ সমাধান হিসাবে ব্যবহার করা উচিত।

8080 বন্দরটিতে সকেট বাউন্ড (উভয় প্রান্তে) থাকা সর্বাধিক শুরু হওয়া প্রক্রিয়াটি হত্যার জন্য আপনি এটি করতে পারেন:

#! /bin/sh -
unset IFS
pids=$(lsof -ti:8080) &&
  LC_ALL=C ps -o pid=,lstart= -p $pids |
  LC_ALL=C sort -k6,6n -k4,4M -k3,3n -k5,5 -k1,1n |
  awk 'END{system("kill " $1)}'

(ধরে নিলেন জিএনইউ sort(যেমন ম্যাকোএসে পাওয়া গেছে)) এবং এমন একটি psবাস্তবায়ন যা lstartকলামটি সমর্থন করে (যেমন ম্যাকোএস 'এবং প্রোপস-এনজি এর, যদিও কোডটি প্রোপস-এনজি আপডেট করতে হবে যেখানে মাস এবং দিনের ক্ষেত্রগুলি অদলবদল করা আছে)।


1

এটি আমাকে একটি প্রম্পট দিয়েছে cmdsubst>

কারণ আপনি যখন কমান্ডটি টাইপ করেন আপনি টাইপ করেননি

killl
আপনি টাইপ করেছেন

কিল $ (
অথবা সাদৃশ্যপূর্ণ. এটি স্ক্রিপ্টের নামের সাথে কিছুই করার ছিল না , এমনকি এটি এটি প্রথম স্থানে স্ক্রিপ্ট ছিল। সম্পূর্ণ অস্তিত্বহীন কমান্ডের সাহায্যে আপনি একই প্রভাব অর্জন করতে পারতেন:

জিক $ (
শেলের পার্সারটি কেবলমাত্র আংশিক সম্পূর্ণ কমান্ডটি সম্পূর্ণ করতে আরও ইনপুট প্রত্যাশা করেছিল। স্ক্রিপ্টের নাম সম্পর্কে আপনার চিন্তাভাবনা সম্পূর্ণ রেড হেরিং।


6
এটি killl $(কোনও কারণে তিনি টাইপ করেছেন তা বলার পক্ষে একটি দুর্দান্ত ধারণা এবং এটি সম্ভবত এটি করার সম্ভাবনা খুব কম। স্টাফেন চেজেলাসের উত্তর সম্ভবত এর চেয়ে বেশি।
হিরোহতার

1
যদি এটি টাইপোর কারণে হয় তবে `তার চেয়ে বেশি সম্ভাবনা রয়েছে $(
এমিল জেবেক

2
না, এমিল জ্যাবেক; এটি একই প্রম্পট দেয় না বলে` সম্ভবত এটি মোটেই সম্ভব নয় । চেষ্টা করে দেখুন না, হার্হ্তার; টাইপ করার সময় এটি অনুমান নয় যে অনুরূপটি অনুরূপ হয় সেই প্রম্পটটি পাওয়ার উপায় । এটি একটি ছাড়
JdeBP

1
আপনি killlদৃsert়ভাবে বলছেন যে ওপি "টাইপ করেনি ," যখন স্টাফেন চেজেলাস ব্যাখ্যা করেছেন, এটি সম্পূর্ণভাবে সম্ভব যে ওপি টাইপ করেছিল killl। অতএব, আমি আপনার উত্তরটিকে ভুল হিসাবে স্বীকার করেছি।
কেভিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.