سؤال

إليك مقتطف من البرنامج النصي الباشي الذي أكتب إليه لتسجيل الأحمال CPU:

#!/bin/bash
# ... irrelevant nonsense ...
cmd1="/usr/bin/mpstat -P ALL | egrep '(AM|PM)([[:space:]]+)(0)' | tr -s ' ' | cut -d' ' -f4"
ldsys="$(echo $cmd1 | /bin/sh)"
# ... irrelevant nonsense ...

$ldsys يتم ضبطه بشكل صحيح عند تنفيذ البرنامج النصي تقليديا من وحدة التحكم. انها ذهبية. إليك المشكلة: عند تنفيذها مع Crontab، $ldsys فارغ.

لقد كنت أحاول ملايين الأشياء خلال الساعات الثلاث الماضية لمحاولة الحصول على هذا الشيء يعمل ... لكنني لا أستطيع أن أجد اي شى. وبعد هل لدى أي شخص أي أفكار؟


ملاحظات:

  • /usr/bin/mpstat يمكن أعدم بواسطة كرون. اخترت من خلال إضافة مهمة وهمية لإطلاق النار كل دقيقة: /usr/bin/mpstat -P ALL >> somefile والتحقق من الإخراج. إنها تعمل.

  • egrep, tr, ، و cut كل وظيفة غرامة تحت كرون.

  • أفكر في الأمر فعلا أن أفعل مع اتفاقية مهمة التقييم ... لكنني لا أعرف لماذا ستكون هذه مشكلة بالنظر إلى أنها بناء أساسية نسبيا ... بعد محاولة اقتراح آدم، ليس لدي الآن أي فكرة عما أظن ...

يحرر: جردت خارج eval الاستخدام ... لا يزال لا النرد.

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

المحلول

مشكلتك تأتي من mpstat. وبعد عند تشغيله من موجه الأوامر، فإنه يخرج الوقت مع AM / PM. لا عند تشغيله cron. وبعد كما ennuikiller. اقترح، ربما مشكلة بيئة. على نظامي echo $LANG يعطي "en_us.utf-8" في موجه الأوامر، ولكن لا شيء عند تشغيله cron. وبعد هذا أو بعض متغير البيئة الأخرى يؤثر على الطريق mpstat أوقات النواتج لذلك عندما تكون grep ل "(أنا | PM)" لا يجدها.

بالمناسبة، لماذا لا تفعل فقط:

ldsys=$(/usr/bin/mpstat ... )

بدون مهمة "CMD1"، eval, ، ال echo والأنابيب إلى sh?

نصائح أخرى

أنت تواجه أحد المشكلتين التاليين:

This is perhaps our number one complaint with cron. When you login to Unix, startup scripts setup your environment. You can see your environment with the commands "printenv" or "env". On the other hand, cron sets up only a sparse environment 

عادة يتم إرسال إخراج أي برنامج إلى Stdout (قياسي خارج) وعادة ما ينتهي عادة شاشة عرض شخص ما. بالنسبة للوظائف التي بدأتها Cron، سيتم توجيه Stdout إلى النظام الفرعي للبريد المحلي، مما يعني أنه سيتم إرسال أي إخراج تم إنشاؤه بواسطة وظيفة Cron إلى المستخدم الذي يمتلك الوظيفة

هل حاولت القضاء على eval?

بدلا من

ldsys=`eval $cmd1`

يحاول

ldsys=`echo "$cmd1" | /bin/sh`

أو

ldsys="$(echo $cmd1 | /bin/sh)"
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top