when memory_get_usage() isn't available to you...?

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • comp.lang.php

    when memory_get_usage() isn't available to you...?

    I wrote my own version of memory_get_usag e() if that function is not
    available:

    [PHP]
    if (!function_exis ts('memory_get_ usage')) {
    /**
    * Determine the amount of memory you are allowed to have
    *
    * @access public
    * @return long
    * @link
    http://us2.php.net/manual/en/function.memory-get-usage.php#64156
    * @see link regarding usage of memory_get_usag e() homegrown function
    * @see DBActionPerform er
    */
    function memory_get_usag e() {
    // NEW 1/15/2007: EMERGENCY PATCH TO REINTRODUCE DBActionPerform er
    if (!class_exists( 'DBActionPerfor mer')) {
    global $basePath;
    if (!class_exists( 'MethodGenerato rForActionPerfo rmer'))
    require_once("$ basePath/include/classes.inc.php ");
    require_once("$ basePath/include/db_action.inc.p hp");
    }
    $dbAP =& new DBActionPerform er(); // NO DB ACTION REQUIRED HERE JUST
    THE CLASS OBJECT INSTANCE FOR getKommandOSArr ay() METHOD
    list($memKomman d, $memRedirect) =
    @array_values($ dbAP->getKommandOSAr ray('allowed-memory'));
    $outputArray = array();
    exec("$memKomma nd $memRedirect", $outputArray);
    if ($_ENV['windir'] || $_SERVER['windir']) {
    return preg_replace( '/[\D]/', '', $outputArray[5]) * 1024;
    } else {
    $outputArray = @explode(' ', $outputArray[0]);
    return $outputArray[1] * 1024;
    }
    }
    }
    [/PHP]

    This function works in *nix and Win XP Pro and Win 2003 Server with no
    problems.

    However, the dev environment is using Win XP Home with PHP 5.2.0 and
    the function is not only not available, my homegrown version breaks as
    well because "tasklist" is a DOS program only available to Win XP Pro
    and Win 2003 Server, definitely not to XP Home.

    Because of this I need another variation of my function but don't have
    any idea where to begin to look. "pslist" is also not an option
    because the business requirement for the app is that it must be a
    dual-functioning (Windows and *nix) PHP PORTABLE web application, so
    you have to pack it up and go every time, so having executables along
    like "pslist" is not always a viable option.

    Suggestions?

    Thanx
    Phil

  • petersprc

    #2
    Re: when memory_get_usag e() isn't available to you...?

    If you were willing to include pslist inside your app's directory, you
    could use it only when necessary, thus preserving portability. For
    example:

    if (substr(PHP_OS, 0,3) == 'WIN') {
    // Only run pslist on windows
    exec(dirname(__ FILE__) . '/win/pslist -m ' . getmypid(),
    $lines, $rc);
    [...]
    } else {
    // Something else for unix
    }

    Another way might be to use the win32 API functions and call
    GetProcessMemor yInfo from psapi.dll. Here's an example of calling a
    win32 function:



    If you have the php_win32ps.dll extension loaded, you can could call
    win32_ps_stat_p roc(getmypid()) .

    comp.lang.php wrote:
    I wrote my own version of memory_get_usag e() if that function is not
    available:
    >
    [PHP]
    if (!function_exis ts('memory_get_ usage')) {
    /**
    * Determine the amount of memory you are allowed to have
    *
    * @access public
    * @return long
    * @link
    http://us2.php.net/manual/en/function.memory-get-usage.php#64156
    * @see link regarding usage of memory_get_usag e() homegrown function
    * @see DBActionPerform er
    */
    function memory_get_usag e() {
    // NEW 1/15/2007: EMERGENCY PATCH TO REINTRODUCE DBActionPerform er
    if (!class_exists( 'DBActionPerfor mer')) {
    global $basePath;
    if (!class_exists( 'MethodGenerato rForActionPerfo rmer'))
    require_once("$ basePath/include/classes.inc.php ");
    require_once("$ basePath/include/db_action.inc.p hp");
    }
    $dbAP =& new DBActionPerform er(); // NO DB ACTION REQUIRED HERE JUST
    THE CLASS OBJECT INSTANCE FOR getKommandOSArr ay() METHOD
    list($memKomman d, $memRedirect) =
    @array_values($ dbAP->getKommandOSAr ray('allowed-memory'));
    $outputArray = array();
    exec("$memKomma nd $memRedirect", $outputArray);
    if ($_ENV['windir'] || $_SERVER['windir']) {
    return preg_replace( '/[\D]/', '', $outputArray[5]) * 1024;
    } else {
    $outputArray = @explode(' ', $outputArray[0]);
    return $outputArray[1] * 1024;
    }
    }
    }
    [/PHP]
    >
    This function works in *nix and Win XP Pro and Win 2003 Server with no
    problems.
    >
    However, the dev environment is using Win XP Home with PHP 5.2.0 and
    the function is not only not available, my homegrown version breaks as
    well because "tasklist" is a DOS program only available to Win XP Pro
    and Win 2003 Server, definitely not to XP Home.
    >
    Because of this I need another variation of my function but don't have
    any idea where to begin to look. "pslist" is also not an option
    because the business requirement for the app is that it must be a
    dual-functioning (Windows and *nix) PHP PORTABLE web application, so
    you have to pack it up and go every time, so having executables along
    like "pslist" is not always a viable option.
    >
    Suggestions?
    >
    Thanx
    Phil

    Comment

    • comp.lang.php

      #3
      Re: when memory_get_usag e() isn't available to you...?


      petersprc wrote:
      If you were willing to include pslist inside your app's directory, you
      could use it only when necessary, thus preserving portability. For
      example:
      >
      if (substr(PHP_OS, 0,3) == 'WIN') {
      // Only run pslist on windows
      exec(dirname(__ FILE__) . '/win/pslist -m ' . getmypid(),
      $lines, $rc);
      [...]
      } else {
      // Something else for unix
      }
      >
      I tried your first suggestion and while it found and installed
      pslist.exe with no problems at all, I never retrieved the memory usage,
      or any memory usage:

      if (!function_exis ts('memory_get_ usage')) {
      /**
      * Determine the amount of memory you are allowed to have
      *
      * @access public
      * @return long
      * @see actual_path
      * @link
      http://us2.php.net/manual/en/functio...sage.php#64156 How to
      use memory_get_usag e() function in this context
      * @link

      Upgrade to client status of memory_get_usag e() for use within Windows
      XP Home
      */
      function memory_get_usag e() {
      global $clientFolderPa th;
      $outputArray = array();
      if (($_SERVER['windir'] || $_ENV['windir']) &&
      @is_dir(actual_ path(realpath(" $clientFolderPa th/win"))) &&

      @is_file(actual _path(realpath( "$clientFolderP ath/win/pslist.exe")))
      ) {
      exec('"' . actual_path($cl ientFolderPath) . '/win/pslist" -m ' .
      getmypid(), $outputArray, $rc);
      print_r(trim(su bstr($outputArr ay[8], 38, 10)) . " is your memory\n");

      return trim(substr($ou tputArray[8], 38, 10));
      } elseif ($_SERVER['windir'] || $_ENV['windir']) {
      exec('tasklist /FI "PID eq ' . getmypid() . '" /FO LIST',
      $outputArray);
      return preg_replace( '/[\D]/', '', $outputArray[5] ) * 1024;
      } else {
      exec('ps -o rss -p ' . getmypid(), $outputArray);
      return $outputArray[1] * 1024;
      }
      }
      }

      Another way might be to use the win32 API functions and call
      GetProcessMemor yInfo from psapi.dll. Here's an example of calling a
      win32 function:
      >
      http://us2.php.net/manual/en/ref.w32api.php#39181
      What do I need to be able to do this? This one lost me.
      >
      If you have the php_win32ps.dll extension loaded, you can could call
      win32_ps_stat_p roc(getmypid()) .
      Sorry, no can do here either. win32ps.dll is only available for PHP
      5.1.2 and PHP 6.0, there is no version for PHP 5.2.0 publically
      available, thus, there is no match and PHP won't install the DLL file
      as a result.

      if (!function_exis ts('memory_get_ usage')) {
      /**
      * Determine the amount of memory you are allowed to have
      *
      * @access public
      * @return long
      * @see actual_path
      * @link
      http://us2.php.net/manual/en/functio...sage.php#64156 How to
      use memory_get_usag e() function in this context
      * @link

      Upgrade to client status of memory_get_usag e() for use within Windows
      XP Home
      */
      function memory_get_usag e() {
      global $clientFolderPa th;
      $outputArray = array();
      if (($_SERVER['windir'] || $_ENV['windir']) &&
      extension_loade d('win32ps')) {
      return win32_ps_stat_p roc(getmypid()) ;
      } elseif (($_SERVER['windir'] || $_ENV['windir']) &&
      @is_dir(actual_ path(realpath(" $clientFolderPa th/win"))) &&

      @is_file(actual _path(realpath( "$clientFolderP ath/win/pslist.exe")))
      ) {
      print_r(trim(su bstr($outputArr ay[8], 38, 10)) . " is your memory\n");

      return trim(substr($ou tputArray[8], 38, 10));
      } elseif ($_SERVER['windir'] || $_ENV['windir']) {
      exec('tasklist /FI "PID eq ' . getmypid() . '" /FO LIST',
      $outputArray);
      return preg_replace( '/[\D]/', '', $outputArray[5] ) * 1024;
      } else {
      exec('ps -o rss -p ' . getmypid(), $outputArray);
      return $outputArray[1] * 1024;
      }
      }
      >
      comp.lang.php wrote:
      I wrote my own version of memory_get_usag e() if that function is not
      available:

      [PHP]
      if (!function_exis ts('memory_get_ usage')) {
      /**
      * Determine the amount of memory you are allowed to have
      *
      * @access public
      * @return long
      * @link
      http://us2.php.net/manual/en/function.memory-get-usage.php#64156
      * @see link regarding usage of memory_get_usag e() homegrown function
      * @see DBActionPerform er
      */
      function memory_get_usag e() {
      // NEW 1/15/2007: EMERGENCY PATCH TO REINTRODUCE DBActionPerform er
      if (!class_exists( 'DBActionPerfor mer')) {
      global $basePath;
      if (!class_exists( 'MethodGenerato rForActionPerfo rmer'))
      require_once("$ basePath/include/classes.inc.php ");
      require_once("$ basePath/include/db_action.inc.p hp");
      }
      $dbAP =& new DBActionPerform er(); // NO DB ACTION REQUIRED HERE JUST
      THE CLASS OBJECT INSTANCE FOR getKommandOSArr ay() METHOD
      list($memKomman d, $memRedirect) =
      @array_values($ dbAP->getKommandOSAr ray('allowed-memory'));
      $outputArray = array();
      exec("$memKomma nd $memRedirect", $outputArray);
      if ($_ENV['windir'] || $_SERVER['windir']) {
      return preg_replace( '/[\D]/', '', $outputArray[5]) * 1024;
      } else {
      $outputArray = @explode(' ', $outputArray[0]);
      return $outputArray[1] * 1024;
      }
      }
      }
      [/PHP]

      This function works in *nix and Win XP Pro and Win 2003 Server with no
      problems.

      However, the dev environment is using Win XP Home with PHP 5.2.0 and
      the function is not only not available, my homegrown version breaks as
      well because "tasklist" is a DOS program only available to Win XP Pro
      and Win 2003 Server, definitely not to XP Home.

      Because of this I need another variation of my function but don't have
      any idea where to begin to look. "pslist" is also not an option
      because the business requirement for the app is that it must be a
      dual-functioning (Windows and *nix) PHP PORTABLE web application, so
      you have to pack it up and go every time, so having executables along
      like "pslist" is not always a viable option.

      Suggestions?

      Thanx
      Phil

      Comment

      • petersprc

        #4
        Re: when memory_get_usag e() isn't available to you...?

        Try running it from the command line first, you may need to click the
        license dialog on the first run. Then try printing the $outputLines to
        see what you got.

        comp.lang.php wrote:
        petersprc wrote:
        If you were willing to include pslist inside your app's directory, you
        could use it only when necessary, thus preserving portability. For
        example:

        if (substr(PHP_OS, 0,3) == 'WIN') {
        // Only run pslist on windows
        exec(dirname(__ FILE__) . '/win/pslist -m ' . getmypid(),
        $lines, $rc);
        [...]
        } else {
        // Something else for unix
        }
        >
        I tried your first suggestion and while it found and installed
        pslist.exe with no problems at all, I never retrieved the memory usage,
        or any memory usage:
        >
        if (!function_exis ts('memory_get_ usage')) {
        /**
        * Determine the amount of memory you are allowed to have
        *
        * @access public
        * @return long
        * @see actual_path
        * @link
        http://us2.php.net/manual/en/functio...sage.php#64156 How to
        use memory_get_usag e() function in this context
        * @link

        Upgrade to client status of memory_get_usag e() for use within Windows
        XP Home
        */
        function memory_get_usag e() {
        global $clientFolderPa th;
        $outputArray = array();
        if (($_SERVER['windir'] || $_ENV['windir']) &&
        @is_dir(actual_ path(realpath(" $clientFolderPa th/win"))) &&
        >
        @is_file(actual _path(realpath( "$clientFolderP ath/win/pslist.exe")))
        ) {
        exec('"' . actual_path($cl ientFolderPath) . '/win/pslist" -m ' .
        getmypid(), $outputArray, $rc);
        print_r(trim(su bstr($outputArr ay[8], 38, 10)) . " is your memory\n");
        >
        return trim(substr($ou tputArray[8], 38, 10));
        } elseif ($_SERVER['windir'] || $_ENV['windir']) {
        exec('tasklist /FI "PID eq ' . getmypid() . '" /FO LIST',
        $outputArray);
        return preg_replace( '/[\D]/', '', $outputArray[5] ) * 1024;
        } else {
        exec('ps -o rss -p ' . getmypid(), $outputArray);
        return $outputArray[1] * 1024;
        }
        }
        }
        >
        >
        Another way might be to use the win32 API functions and call
        GetProcessMemor yInfo from psapi.dll. Here's an example of calling a
        win32 function:

        http://us2.php.net/manual/en/ref.w32api.php#39181
        >
        What do I need to be able to do this? This one lost me.
        >

        If you have the php_win32ps.dll extension loaded, you can could call
        win32_ps_stat_p roc(getmypid()) .
        >
        Sorry, no can do here either. win32ps.dll is only available for PHP
        5.1.2 and PHP 6.0, there is no version for PHP 5.2.0 publically
        available, thus, there is no match and PHP won't install the DLL file
        as a result.
        >
        if (!function_exis ts('memory_get_ usage')) {
        /**
        * Determine the amount of memory you are allowed to have
        *
        * @access public
        * @return long
        * @see actual_path
        * @link
        http://us2.php.net/manual/en/functio...sage.php#64156 How to
        use memory_get_usag e() function in this context
        * @link

        Upgrade to client status of memory_get_usag e() for use within Windows
        XP Home
        */
        function memory_get_usag e() {
        global $clientFolderPa th;
        $outputArray = array();
        if (($_SERVER['windir'] || $_ENV['windir']) &&
        extension_loade d('win32ps')) {
        return win32_ps_stat_p roc(getmypid()) ;
        } elseif (($_SERVER['windir'] || $_ENV['windir']) &&
        @is_dir(actual_ path(realpath(" $clientFolderPa th/win"))) &&
        >
        @is_file(actual _path(realpath( "$clientFolderP ath/win/pslist.exe")))
        ) {
        print_r(trim(su bstr($outputArr ay[8], 38, 10)) . " is your memory\n");
        >
        return trim(substr($ou tputArray[8], 38, 10));
        } elseif ($_SERVER['windir'] || $_ENV['windir']) {
        exec('tasklist /FI "PID eq ' . getmypid() . '" /FO LIST',
        $outputArray);
        return preg_replace( '/[\D]/', '', $outputArray[5] ) * 1024;
        } else {
        exec('ps -o rss -p ' . getmypid(), $outputArray);
        return $outputArray[1] * 1024;
        }
        }

        comp.lang.php wrote:
        I wrote my own version of memory_get_usag e() if that function is not
        available:
        >
        [PHP]
        if (!function_exis ts('memory_get_ usage')) {
        /**
        * Determine the amount of memory you are allowed to have
        *
        * @access public
        * @return long
        * @link
        http://us2.php.net/manual/en/function.memory-get-usage.php#64156
        * @see link regarding usage of memory_get_usag e() homegrown function
        * @see DBActionPerform er
        */
        function memory_get_usag e() {
        // NEW 1/15/2007: EMERGENCY PATCH TO REINTRODUCE DBActionPerform er
        if (!class_exists( 'DBActionPerfor mer')) {
        global $basePath;
        if (!class_exists( 'MethodGenerato rForActionPerfo rmer'))
        require_once("$ basePath/include/classes.inc.php ");
        require_once("$ basePath/include/db_action.inc.p hp");
        }
        $dbAP =& new DBActionPerform er(); // NO DB ACTION REQUIRED HERE JUST
        THE CLASS OBJECT INSTANCE FOR getKommandOSArr ay() METHOD
        list($memKomman d, $memRedirect) =
        @array_values($ dbAP->getKommandOSAr ray('allowed-memory'));
        $outputArray = array();
        exec("$memKomma nd $memRedirect", $outputArray);
        if ($_ENV['windir'] || $_SERVER['windir']) {
        return preg_replace( '/[\D]/', '', $outputArray[5]) * 1024;
        } else {
        $outputArray = @explode(' ', $outputArray[0]);
        return $outputArray[1] * 1024;
        }
        }
        }
        [/PHP]
        >
        This function works in *nix and Win XP Pro and Win 2003 Server with no
        problems.
        >
        However, the dev environment is using Win XP Home with PHP 5.2.0 and
        the function is not only not available, my homegrown version breaks as
        well because "tasklist" is a DOS program only available to Win XP Pro
        and Win 2003 Server, definitely not to XP Home.
        >
        Because of this I need another variation of my function but don't have
        any idea where to begin to look. "pslist" is also not an option
        because the business requirement for the app is that it must be a
        dual-functioning (Windows and *nix) PHP PORTABLE web application, so
        you have to pack it up and go every time, so having executables along
        like "pslist" is not always a viable option.
        >
        Suggestions?
        >
        Thanx
        Phil

        Comment

        • comp.lang.php

          #5
          Re: when memory_get_usag e() isn't available to you...?


          petersprc wrote:
          Try running it from the command line first, you may need to click the
          license dialog on the first run. Then try printing the $outputLines to
          see what you got.
          Sorry I can't paste it here, my terminal window is being utterly
          uncooperative tonight

          I do not see the 7th element, I only see 4 elements, the 4th being a
          tab-delimited list of numbers

          Phil
          >
          comp.lang.php wrote:
          petersprc wrote:
          If you were willing to include pslist inside your app's directory, you
          could use it only when necessary, thus preserving portability. For
          example:
          >
          if (substr(PHP_OS, 0,3) == 'WIN') {
          // Only run pslist on windows
          exec(dirname(__ FILE__) . '/win/pslist -m ' . getmypid(),
          $lines, $rc);
          [...]
          } else {
          // Something else for unix
          }
          >
          I tried your first suggestion and while it found and installed
          pslist.exe with no problems at all, I never retrieved the memory usage,
          or any memory usage:

          if (!function_exis ts('memory_get_ usage')) {
          /**
          * Determine the amount of memory you are allowed to have
          *
          * @access public
          * @return long
          * @see actual_path
          * @link
          http://us2.php.net/manual/en/functio...sage.php#64156 How to
          use memory_get_usag e() function in this context
          * @link

          Upgrade to client status of memory_get_usag e() for use within Windows
          XP Home
          */
          function memory_get_usag e() {
          global $clientFolderPa th;
          $outputArray = array();
          if (($_SERVER['windir'] || $_ENV['windir']) &&
          @is_dir(actual_ path(realpath(" $clientFolderPa th/win"))) &&

          @is_file(actual _path(realpath( "$clientFolderP ath/win/pslist.exe")))
          ) {
          exec('"' . actual_path($cl ientFolderPath) . '/win/pslist" -m ' .
          getmypid(), $outputArray, $rc);
          print_r(trim(su bstr($outputArr ay[8], 38, 10)) . " is your memory\n");

          return trim(substr($ou tputArray[8], 38, 10));
          } elseif ($_SERVER['windir'] || $_ENV['windir']) {
          exec('tasklist /FI "PID eq ' . getmypid() . '" /FO LIST',
          $outputArray);
          return preg_replace( '/[\D]/', '', $outputArray[5] ) * 1024;
          } else {
          exec('ps -o rss -p ' . getmypid(), $outputArray);
          return $outputArray[1] * 1024;
          }
          }
          }

          Another way might be to use the win32 API functions and call
          GetProcessMemor yInfo from psapi.dll. Here's an example of calling a
          win32 function:
          >
          http://us2.php.net/manual/en/ref.w32api.php#39181
          What do I need to be able to do this? This one lost me.
          >
          If you have the php_win32ps.dll extension loaded, you can could call
          win32_ps_stat_p roc(getmypid()) .
          Sorry, no can do here either. win32ps.dll is only available for PHP
          5.1.2 and PHP 6.0, there is no version for PHP 5.2.0 publically
          available, thus, there is no match and PHP won't install the DLL file
          as a result.

          if (!function_exis ts('memory_get_ usage')) {
          /**
          * Determine the amount of memory you are allowed to have
          *
          * @access public
          * @return long
          * @see actual_path
          * @link
          http://us2.php.net/manual/en/functio...sage.php#64156 How to
          use memory_get_usag e() function in this context
          * @link

          Upgrade to client status of memory_get_usag e() for use within Windows
          XP Home
          */
          function memory_get_usag e() {
          global $clientFolderPa th;
          $outputArray = array();
          if (($_SERVER['windir'] || $_ENV['windir']) &&
          extension_loade d('win32ps')) {
          return win32_ps_stat_p roc(getmypid()) ;
          } elseif (($_SERVER['windir'] || $_ENV['windir']) &&
          @is_dir(actual_ path(realpath(" $clientFolderPa th/win"))) &&

          @is_file(actual _path(realpath( "$clientFolderP ath/win/pslist.exe")))
          ) {
          print_r(trim(su bstr($outputArr ay[8], 38, 10)) . " is your memory\n");

          return trim(substr($ou tputArray[8], 38, 10));
          } elseif ($_SERVER['windir'] || $_ENV['windir']) {
          exec('tasklist /FI "PID eq ' . getmypid() . '" /FO LIST',
          $outputArray);
          return preg_replace( '/[\D]/', '', $outputArray[5] ) * 1024;
          } else {
          exec('ps -o rss -p ' . getmypid(), $outputArray);
          return $outputArray[1] * 1024;
          }
          }
          >
          comp.lang.php wrote:
          I wrote my own version of memory_get_usag e() if that function is not
          available:

          [PHP]
          if (!function_exis ts('memory_get_ usage')) {
          /**
          * Determine the amount of memory you are allowed to have
          *
          * @access public
          * @return long
          * @link
          http://us2.php.net/manual/en/function.memory-get-usage.php#64156
          * @see link regarding usage of memory_get_usag e() homegrown function
          * @see DBActionPerform er
          */
          function memory_get_usag e() {
          // NEW 1/15/2007: EMERGENCY PATCH TO REINTRODUCE DBActionPerform er
          if (!class_exists( 'DBActionPerfor mer')) {
          global $basePath;
          if (!class_exists( 'MethodGenerato rForActionPerfo rmer'))
          require_once("$ basePath/include/classes.inc.php ");
          require_once("$ basePath/include/db_action.inc.p hp");
          }
          $dbAP =& new DBActionPerform er(); // NO DB ACTION REQUIRED HERE JUST
          THE CLASS OBJECT INSTANCE FOR getKommandOSArr ay() METHOD
          list($memKomman d, $memRedirect) =
          @array_values($ dbAP->getKommandOSAr ray('allowed-memory'));
          $outputArray = array();
          exec("$memKomma nd $memRedirect", $outputArray);
          if ($_ENV['windir'] || $_SERVER['windir']) {
          return preg_replace( '/[\D]/', '', $outputArray[5]) * 1024;
          } else {
          $outputArray = @explode(' ', $outputArray[0]);
          return $outputArray[1] * 1024;
          }
          }
          }
          [/PHP]

          This function works in *nix and Win XP Pro and Win 2003 Server with no
          problems.

          However, the dev environment is using Win XP Home with PHP 5.2.0 and
          the function is not only not available, my homegrown version breaks as
          well because "tasklist" is a DOS program only available to Win XP Pro
          and Win 2003 Server, definitely not to XP Home.

          Because of this I need another variation of my function but don't have
          any idea where to begin to look. "pslist" is also not an option
          because the business requirement for the app is that it must be a
          dual-functioning (Windows and *nix) PHP PORTABLE web application, so
          you have to pack it up and go every time, so having executables along
          like "pslist" is not always a viable option.

          Suggestions?

          Thanx
          Phil

          Comment

          Working...