প্রদত্ত প্রক্রিয়াটির জন্য কমপক্ষে 5 মিনিট থেকে চলছে এমন প্রক্রিয়াগুলি মেরে ফেলতে আমার কমান্ডটি দরকার।
আমাকে প্রতি পাঁচ মিনিট বা তার পরে এই কমান্ডটি চালাতে হবে।
অসংখ্য ধন্যবাদ !
(সিস্টেমটি সেন্টোস 5)
প্রদত্ত প্রক্রিয়াটির জন্য কমপক্ষে 5 মিনিট থেকে চলছে এমন প্রক্রিয়াগুলি মেরে ফেলতে আমার কমান্ডটি দরকার।
আমাকে প্রতি পাঁচ মিনিট বা তার পরে এই কমান্ডটি চালাতে হবে।
অসংখ্য ধন্যবাদ !
(সিস্টেমটি সেন্টোস 5)
উত্তর:
kill -9 $(ps -eo comm,pid,etimes | awk '/^procname/ {if ($3 > 300) { print $2}}')
যেখানে "প্রোকনাম" একটি প্রক্রিয়া নাম এবং 300 চলমান সময় থ্রেশহোল্ড
$(ps -eo comm,pid,etimes | awk '/^procname/ {if ($3 > 300) { print "kill "$2}}')
কিছুটা মসৃণ তবে উত্তরটি যাইহোক দুর্দান্ত
আমার পূর্ববর্তী উভয় জবাব থেকে ক্রিপ্ট স্ক্রিপ্ট সংস্করণ:
#!/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 দ্বারা প্রক্রিয়া ফিল্টার করে এবং যদি কার্যকরকরণের সময় সীমা ছাড়িয়ে যায় - প্রক্রিয়াগুলি মেরে ফেলে এবং ইমেলটিতে প্রতিবেদন প্রেরণ করে। আপনার যদি সেই ইমেলটির প্রয়োজন না হয় - আপনি কেবল শেষ লাইনে মন্তব্য করতে পারেন।
আমি এই পৃষ্ঠায় সমাধানটি পেয়েছি: 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
kill -9
কারণ এটি প্রস্থানগুলি বের হওয়ার আগে প্রক্রিয়াগুলিকে ক্রেফফুল ক্লিনআপ করার সুযোগ দেয় না।
এখানে একটি স্ক্রিপ্ট রয়েছে যা আপনি যা করতে চান তা করতে আপনি পরিবর্তন করতে পারেন।
সম্পাদনা নীচে স্ক্রিপ্ট যোগ
#!/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
etimes
এর ps
আপনি সরাসরি প্রক্রিয়া শুরু (শুরুর সময় থেকে এটা গনা করার কোন প্রয়োজন) যেহেতু অতিবাহিত সেকেন্ড দেখানোর জন্য।
ps
যে সংস্করণগুলির সংস্করণগুলি সমর্থন করে না etimes
(কেবলমাত্র etime
) তখন এটি একটি দুর্দান্ত বিকল্প। আমি এটা করার সময় ব্যবহৃত শীর্ষ উত্তর থেকে আমাকে একটি ত্রুটি দিলেনps
আমাকে একই ধরণের কাজটি সমাধান করতে হয়েছিল এবং এর জন্য স্ক্রিপ্টের দরকার নেই। এক্সিকিউটেবল "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
-9
আমার প্রসেসগুলির সাথে সামান্য বন্ধুত্বপূর্ণ না হয়ে এটি ব্যবহার করেছি এবং এরgrep -v defunct |
আগে একটি যোগ করেছি যা আপনি আপনার আউটপুটেawk
দেখতে পাচ্ছেনprocname <defunct>
যা অর্ডিক কমান্ডটি কোনও বৈধ পিআইডি না ফিরিয়ে দেবে। এবং এটি কমান্ড কমান্ড ভঙ্গ করবে।