আইসো তারিখ ফর্ম্যাট সঙ্গে পিএস আউটপুট?


9

আমি এই আউটপুটটি lstart(প্রক্রিয়া শুরু করে) দ্বারা বাছাই করতে চাই :

ps -eo lstart,pid,cmd 

YYYY-MM-DD HH: MM: SS এর মতো ISO ফর্ম্যাটে lstart আউটপুট দেওয়ার কোনও উপায় আছে কি?

তবে একা বাছাই করা এর সমাধান করে না। আমি সত্যিই আইএসও তারিখের ফর্ম্যাটটি চাই।


কেন lstartএমন একটি জঘন্য বিন্যাস আছে। এটি আরএফসি ২৮২২ এর কাছাকাছি কিন্তু শেষ বছর সহ।
ভান

উত্তর:


10

lstartআইএসও ফর্ম্যাটে আউটপুট দেওয়ার মতো কোনও উপায় আছে কি YYYY-MM-DD HH:MM:SS?

সহ awk+ dateসহযোগিতা:

ps -eo lstart,pid,cmd --sort=start_time | awk '{ 
       cmd="date -d\""$1 FS $2 FS $3 FS $4 FS $5"\" +\047%Y-%m-%d %H:%M:%S\047"; 
       cmd | getline d; close(cmd); $1=$2=$3=$4=$5=""; printf "%s\n",d$0 }'

পিএস etimes কীওয়ার্ড ব্যবহার করে বিকল্প পদ্ধতি (প্রক্রিয়া শুরু হওয়ার পরে সময় অতিবাহিত হয়েছে, কয়েক সেকেন্ডে):

ps -eo etimes,pid,cmd --sort=etimes | awk '{ 
       cmd="date -d -"$1"seconds +\047%Y-%m-%d %H:%M:%S\047"; 
       cmd | getline d; close(cmd); $1=""; printf "%s\n",d$0 }' 
  • date -d -"$1"seconds- বর্তমান টাইমস্ট্যাম্প এবং elapsedসময়ের মধ্যে পার্থক্য , প্রক্রিয়াটির টাইমস্ট্যাম্প মান দেবে

2
এর চেয়ে সহজ উপায় কি নেই?
গেটললি

3
আপনি যদি etimesপরিবর্তে পিএস ফর্ম্যাট ব্যবহার lstartকরেন তবে সেকেন্ডে সময় অতিবাহিত হয়ে যা কিছুটা সহজ date -d -999seconds
meuh

@ মিউহ, হ্যাঁ, এটি কিছুটা ছোট হবে, আমি একটি আপডেট করেছি
রোমানপেরেখারেস্ট

@ গুয়েটলি, এটিকে সহজ বলতে পারবেন না, তবে আপনি কিছুটা ছোট পথ পেয়েছেন
রোমানপেরেখারেস্ট

4

আপনি এর সাথে বাছাই করতে পারেন:

ps -eo lstart,pid,cmd --sort=start_time

ধন্যবাদ, আমি আমার প্রশ্নটি বাড়িয়ে দিয়েছি। আমিও আইসো তারিখের ফর্ম্যাট চাই।
guettli

2

দ্রষ্টব্য যে lstartমানক ইউনিক্স psকলামগুলির মধ্যে একটি নয়।

সমস্ত সিস্টেমে একটি নয় এবং আউটপুট বাস্তবায়নের মধ্যে এবং সম্ভাব্য লোকালগুলির মধ্যে পরিবর্তিত হয়।

উদাহরণস্বরূপ, ফ্রিবিএসডি বা এর psমাধ্যমে procps-ng(সাধারণত এম্বেডড লিনাক্স ভিত্তিক সিস্টেমগুলিতে পাওয়া যায়) এবং Cলোকেলগুলি সহ, আপনি পাবেন:

Wed Nov  1 12:36:15 2017

ম্যাকোজে:

Wed  1 Nov 12:36:15 2017

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

এখানে, আপনি ইউটিসি হতে হবে এবং ব্যবহার করতে বার বাধ্য করতে পারে perl'র Date::Manipমডিউল একটি উপায় যে বিভিন্ন প্রাকৃতিক ফরম্যাটের বুঝতে পারে তারিখ বিশ্লেষণ করতে:

(export TZ=UTC0 LC_ALL=C
  ps -A -o lstart= -o pid= -o args= |
    perl -MDate::Manip -lpe '
      s/^(\s*\S+){5}/UnixDate(ParseDate($&), "%Y-%m-%dT%T+00:00")/e' |
    sort
)

বা ksh93যার সাহায্যে সেই তারিখের ফর্ম্যাটগুলিও স্বীকৃতি দেয়:

(export TZ=UTC0 LC_ALL=C
  unset -v IFS
  ps -A -o lstart= -o pid= -o args= |
    while read -r a b c d e rest; do
      printf '%(%FT%T+00:00)T %s\n' "$a $b $c $d $e" "$rest"
    done
)

(সাবধান থাকুন এটি প্রতিটি লাইন থেকে ফাঁকা ফাঁকা স্ট্রিপগুলি)

বা সাথে zshএবং জিএনইউ date:

(export LC_ALL=C TZ=UTC0
  (){
    paste -d '\0' <(cut -c1-24 < $1 | date -f- --iso-8601=s) \
                  <(cut -c25-  < $1) | sort
  } =(ps -A -o lstart= -o pid= -o args=)
)

বা শুধুমাত্র bash(বা zsh) লিনাক্সে এবং জিএনইউ সহ date:

(export LC_ALL=C TZ=UTC0
  {
    paste -d '\0' <(cut -c1-24 | date -f- --iso-8601=s) \
                  <(cut -c25- < /dev/stdin) | sort
  } <<< "$(ps -A -o lstart= -o pid= -o args=)"
)

এছাড়াও সাবধান যে প্রক্রিয়া শুরুর সময়টি শেষ বারের মতো একই নয় যে প্রক্রিয়াটি কোনও কমান্ড কার্যকর করেছিল কারণ প্রক্রিয়াগুলি সাধারণত তাদের জীবদ্দশায় একাধিক কমান্ড চালাতে পারে (যেগুলি সাধারণত এমন হয় না যা কখনই আদেশ দেয় না) । অন্য কথায়, এটি কমান্ড ( argsক্ষেত্রের মান সমতুল্য cmd) শুরু হওয়ার সাথে অগত্যা মেলেনি ।

$ sh -c 'sleep 4; exec sleep 123' & sleep 234 & sleep 5
[1] 9380
[2] 9381(export TZ=UTC0 LC_ALL=C; ps -o lstart,pid,args | perl -MDate::Manip -lpe 's/^(\s*\S+){5}/UnixDate(ParseDate($&), "%Y-%m-%dT%T+00:00")/e')

2017-10-30T17:21:06+00:00  3071 zsh
2017-11-01T15:47:48+00:00  9380 sleep 123
2017-11-01T15:47:48+00:00  9381 sleep 234

কিভাবে দেখুন sleep 123হিসাবে একই সময় হিসাবে শুরু হয়েছে দেখা যায় sleep 234যদিও এটি 4 সেকেন্ড পরে শুরু হয়েছে। কারণ এটি কার্যকর করা হওয়ার আগে 9388 প্রক্রিয়াটি প্রাথমিকভাবে চলছিল sh(এবং 4 সেকেন্ডের জন্য অপেক্ষা করছিল sleep 4) sleep 123এবং এটির আগে এটি zshআমার কোড ইন্টারেক্টিভ শেল দ্বারা কাঁটাযুক্ত কোড হিসাবে চলছিল , সুতরাং সেই প্রক্রিয়াটির জন্য সময় অনুযায়ী বিভিন্ন সময়ে, আপনার কাছে psআউটপুটটিতে দেখা : zshতারপর sh, তারপর sleep)।


1
আপনার উত্তর করার জন্য আপনাকে ধন্যবাদ। আগের তুলনায় এখন আমার আরও প্রশ্ন আছে। আমি ভেবেছিলাম একটি সহজ এবং সহজ সমাধান আছে।
guettli

1

এখানে উচ্চতর পারফরম্যান্স সহ একটি বাস্তবায়ন রয়েছে (প্রতি লাইনে নতুন প্রক্রিয়া চালানোর দরকার নেই):

ps -eo etimes,pid,args --sort=etimes | awk 'BEGIN{now=systime()} {$1=strftime("%Y-%m-%d %H:%M:%S", now-$1); print $0}'

এবং এটি কলাম ক্রমটিও খুব সহজে পরিবর্তন করতে দেয়। উদাহরণস্বরূপ pidপ্রথম এবং দ্বিতীয় কলাম হিসাবে সময় শুরু:

ps -eo pid,etimes,args --sort=etimes | awk 'BEGIN{now=systime()} {$2=strftime("%Y-%m-%d %H:%M:%S", now-$2); print $0}'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.