سؤال

على افتراض أنني أعرف PID من عملية وأرغب في إجراء عملية بحث في PS -A، كيف أفعل ذلك؟ حاولت القيام بذلك:

echo "Enter PID to search: "
read PID
search=$(ps -A | grep -v PID | awk '{print $1}') 

هذا يعود لي مع قائمة طويلة من البلاستيك. فكيف يمكنني استخدام كل قيمة فردية للمخرجات والقيام:

if [ "$PID" = "*each_value_in_search_list*" ]; then
........

في هذه الحالة، أحاول مقارنة ما يدخل المستخدم بإخراج أمري، فكيف أفعل ذلك؟ هل أفعل الطريقة الصحيحة في المقام الأول؟ أو هل هناك أي طريقة أخرى للقيام بذلك؟

شكرا لمساعدتكم، كل من أجاب على هذا السؤال. (:

هل كانت مفيدة؟

المحلول

يؤدي مفتاح التبديل الخاص ب GREP إلى إجراء بحث مقلوب، بمعنى آخر سوف تحصل على كل ما تريده. بعد تعيين متغير، يجب أن تشير أيضا إلى البادئة ب $.

جرب هذا

#!/bin/bash

echo "Enter PID to search: "
read PID
search=$(ps --pid $PID -o comm=)

if [ $search ]
    then
        echo "Program: $search"
    else
        echo "No program found with PID: $PID"
fi

نصائح أخرى

أنت تصرخ إخراج ps لجميع الخطوط التي لا تحتوي على السلسلة الحرفية "PID". تريد استخدام $PID بدلا من ذلك لاستخدام عامل اسمه PID بدلا من "PID" الحرفي. علاوة على ذلك، نظرا لأنك لا تريد إيجابيات خاطئة على حقول أخرى مطابقة PID، فما عليك سوى تطابق في العمود الأول:

search=$(ps -A | grep "^ *$PID\>" | awk '{print $1}')

ال "\>" تسلسل الهروب يطابق السلسلة الفارغة في نهاية الكلمة.

بعض إصدارات ps دعم أ -p الخيار ليعطيك فقط المعلومات حول PID معينة، لذلك لا تحتاج GREP أو AWK:

search=$(ps -p $PID)

لك "grep -v PID" هي خدعة قياسية لإزالة خط البند، وليس طريقة للحصول على تفاصيل PID الفعلية من الإخراج.

إذا كان كل ما تريده هو تفاصيل تلك العملية، استخدم فقط:

search=$(ps -A | awk -v pid=$PID '$1==pid{print pid}')

من شأنها أن تحدد البحث على PID في السؤال إذا كان موجودا أو سلسلة فارغة خلاف ذلك، وهو ما يبدو أنك تريده.

هناك مشكلة في إجراء بحث أعمى عن PID (بدلا من التحقق من العمود 1 awk) هل قد تلتقط الخطوط التي تظهر فيها pid في سلسلة الأوامر.

إذا كان جذر السؤال هو التحقق مما إذا كان PID المدخل يتوافق مع إدخال العملية (الجذر). أكثر تحديدا، إذا كنت قادرا على إرسال إشارة إلى تلك العملية (المستخدم):

if kill -0 $PID >/dev/null 2>&1; then ...

يمكن أن يكون، بالطبع، أن هذا ليس على الإطلاق ما تريد. شعرت بالحضارة في "تفسير" سؤالك قليلا؛)

<?php
echo shell_exec("ps -Ao cmd,pid|grep -P ' {$pid}$'");
?>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top