লিনাক্স ব্যাশ স্ক্রিপ্টে প্রদত্ত ব্যবহারকারীর দ্বারা 5 মিনিটেরও বেশি সময় ধরে চলমান সমস্ত প্রক্রিয়া বন্ধ করুন


18

প্রদত্ত প্রক্রিয়াটির জন্য কমপক্ষে 5 মিনিট থেকে চলছে এমন প্রক্রিয়াগুলি মেরে ফেলতে আমার কমান্ডটি দরকার।

আমাকে প্রতি পাঁচ মিনিট বা তার পরে এই কমান্ডটি চালাতে হবে।

অসংখ্য ধন্যবাদ !

(সিস্টেমটি সেন্টোস 5)

linux  bash 

উত্তর:


17
kill -9 $(ps -eo comm,pid,etimes | awk '/^procname/ {if ($3 > 300) { print $2}}')

যেখানে "প্রোকনাম" একটি প্রক্রিয়া নাম এবং 300 চলমান সময় থ্রেশহোল্ড


গ্রেট অনেলাইনার আমি -9আমার প্রসেসগুলির সাথে সামান্য বন্ধুত্বপূর্ণ না হয়ে এটি ব্যবহার করেছি এবং এর grep -v defunct |আগে একটি যোগ করেছি যা আপনি আপনার আউটপুটে awkদেখতে পাচ্ছেন procname <defunct>যা অর্ডিক কমান্ডটি কোনও বৈধ পিআইডি না ফিরিয়ে দেবে। এবং এটি কমান্ড কমান্ড ভঙ্গ করবে।
মাইকেল হার্টল

আমি বলব $(ps -eo comm,pid,etimes | awk '/^procname/ {if ($3 > 300) { print "kill "$2}}')কিছুটা মসৃণ তবে উত্তরটি যাইহোক দুর্দান্ত
ইয়েভজেন

@ হোয়াইটহ্যাট কীভাবে একই কাজ করবে তবে নির্দিষ্ট পিডের প্রক্রিয়া ছাড়া?
পেটার ভাসিলেভ

আমার সময় নষ্ট করার একটি জিনিস হ'ল: 'উইথ নট' ব্যবহার করা উচিত
cn123h

6

সম্ভবত একটি ক্রন্টব এ দীর্ঘ চালিত কমান্ড চালান?

timeout -k 300 command

5

আমার পূর্ববর্তী উভয় জবাব থেকে ক্রিপ্ট স্ক্রিপ্ট সংস্করণ:

#!/bin/bash

#Email to send report
MY_EMAIL="example@email.com"

#Process name to kill
NAME_KILL="php"

#UID to kill
UID_KILL=33.

#Time in seconds which the process is allowed to run
KILL_TIME=60

KILL_LIST=()
EMAIL_LIST=()
while read PROC_UID PROC_PID PROC_ETIMES PROC_ETIME PROC_COMM PROC_ARGS; do
    if [ $PROC_UID -eq $UID_KILL -a "$PROC_COMM" == "$NAME_KILL" -a $PROC_ETIMES -gt $KILL_TIME ]; then
    KILL_LIST+=("$PROC_PID");
    MSG="Killing '$PROC_ARGS' which runs for $PROC_ETIME";
    EMAIL_LIST+=("$MSG");
    echo "$MSG";
    fi
done < <(ps eaxo uid,pid,etimes,etime,comm,args | tail -n+2)
if [ ${#KILL_LIST[*]} -gt 0 ]; then
    kill -9 ${KILL_LIST[@]}
    printf '%s\n' "${EMAIL_LIST[@]}" | mail -s "Long running processes killed" $MY_EMAIL
fi

এটি ইউআইডি, NAME দ্বারা প্রক্রিয়া ফিল্টার করে এবং যদি কার্যকরকরণের সময় সীমা ছাড়িয়ে যায় - প্রক্রিয়াগুলি মেরে ফেলে এবং ইমেলটিতে প্রতিবেদন প্রেরণ করে। আপনার যদি সেই ইমেলটির প্রয়োজন না হয় - আপনি কেবল শেষ লাইনে মন্তব্য করতে পারেন।


2

আমি এই পৃষ্ঠায় সমাধানটি পেয়েছি: http://www.directadmin.com/forum/showthread.php?t=26179

একটি খালি ফাইল তৈরি করুন এবং এটিকে কল্লংপ্রোক.এসএস কল করুন

এই কপি:

#!/bin/bash
# This script will kill process which running more than X hours
# egrep: the selected process; grep: hours
PIDS="`ps eaxo bsdtime,pid,comm | egrep "spamd|exim|mysqld|httpd" | grep " 1:" | awk '{print $2}'`"

# Kill the process
echo "Killing spamd, exim, mysqld and httpd processes running more than one hour..."
for i in ${PIDS}; do { echo "Killing $i"; kill -9 $i; }; done;

আপনার ক্রোনজব এ এটি বন্ধ করুন

15 * * * * * root /{directory}/./killongproc.sh

4
এটি করা সাধারণত একটি খারাপ ধারণা। আপনি কোন সমস্যার সমাধান করার চেষ্টা করছেন? এছাড়াও, আপনার ব্যবহার করা উচিত নয় kill -9কারণ এটি প্রস্থানগুলি বের হওয়ার আগে প্রক্রিয়াগুলিকে ক্রেফফুল ক্লিনআপ করার সুযোগ দেয় না।
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

1
এটি এমন প্রসেসগুলিকে হত্যা করে যা কিছু পরিমাণ সিপিইউ সময় (ব্যবহারকারী + সিস্টেম) গ্রাস করে, এমন প্রক্রিয়া নয় যা কিছু সময়ের জন্য চলমান (যেমন 1 ঘন্টা আগে শুরু হয়েছিল)।
মার্কি 555

2

এখানে একটি স্ক্রিপ্ট রয়েছে যা আপনি যা করতে চান তা করতে আপনি পরিবর্তন করতে পারেন।

সম্পাদনা নীচে স্ক্রিপ্ট যোগ

#!/bin/bash
#
#Put the UID to kill on the next line
UID_KILL=1001

#Put the time in seconds which the process is allowed to run below
KILL_TIME=300

KILL_LIST=`{
ps -eo uid,pid,lstart | tail -n+2 |
    while read PROC_UID PROC_PID PROC_LSTART; do
        SECONDS=$[$(date +%s) - $(date -d"$PROC_LSTART" +%s)]
        if [ $PROC_UID -eq $UID_KILL -a $SECONDS -gt $KILL_TIME ]; then
        echo -n "$PROC_PID "
        fi
     done 
}`

if [[ -n $KILL_LIST ]]
then
        kill $KILL_LIST
fi

এটিকে সংশোধন করার মতো আমার কাছে কোনও জ্ঞান নেই, সে কারণেই আমি আপনাকে জিজ্ঞাসা করছি

2
খুবই জটিল. আপনি কলাম ব্যবহার করতে পারেন etimesএর psআপনি সরাসরি প্রক্রিয়া শুরু (শুরুর সময় থেকে এটা গনা করার কোন প্রয়োজন) যেহেতু অতিবাহিত সেকেন্ড দেখানোর জন্য।
Marki555

@ মার্কি 555 হ্যাঁ এটি সত্য। তবে psযে সংস্করণগুলির সংস্করণগুলি সমর্থন করে না etimes(কেবলমাত্র etime) তখন এটি একটি দুর্দান্ত বিকল্প। আমি এটা করার সময় ব্যবহৃত শীর্ষ উত্তর থেকে আমাকে একটি ত্রুটি দিলেনps
মাইক

0

আমাকে একই ধরণের কাজটি সমাধান করতে হয়েছিল এবং এর জন্য স্ক্রিপ্টের দরকার নেই। এক্সিকিউটেবল "TheCOMMAND" এর প্রক্রিয়া সমাপ্তির জন্য (সিগন্যাল SIGTERM):

killall -u $USER --older-than 5m THECOMMAND

-u $USERযদি অন্য ব্যবহারকারীরাও "THECOMMAND" চালায় তবে অপ্রয়োজনীয় ত্রুটি বার্তাগুলি এড়াতে বর্তমান ব্যবহারকারীর প্রতি সীমাবদ্ধতা প্রয়োজনীয়। আপনার নিজস্ব ব্যবহারকারী ক্রোনট্যাবে আপনি নিম্নলিখিতটি প্রবেশ করতে পারবেন:

*/5 * * * *     killall -u $USER --older-than 5m THECOMMAND

একটি সিস্টেম ক্রন্টবায় (ব্যবহারকারী 'রুট') আপনি নিম্নলিখিতগুলি যুক্ত করবেন:

*/5 * * * *     killall --older-than 5m THECOMMAND

আপনি যদি প্রসেসগুলি (সংকেত) বন্ধ করার পরিবর্তে (SIGKILL) হত্যা করতে চান তবে স্পষ্টভাবে --signal SIGKILLপ্যারামিটারগুলিতে যুক্ত করে SIGKILL সিগন্যাল প্রেরণ করুন । একটি সিস্টেম crontab জন্য উদাহরণ:

*/5 * * * *     killall --older-than 5m --signal SIGKILL THECOMMAND

-4

জন্য httpd

পি এস ইক্সো পিড, সময়, কম | লেজ -n + 2 | grep 'httpd' | awk 'substr ($ 0,9,1)> 0' | awk '{মুদ্রণ $ 1}'

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