Perlscript ทำงานได้ดีเมื่อดำเนินการด้วยตนเอง แต่ไม่อยู่ภายใต้ cron


0

การตั้งค่าไร้สายของฉันล้มเหลววันละหลายครั้งการรีสตาร์ทตัวจัดการเครือข่ายของ gnome จะช่วยได้ ฉันต้องการทำให้เป็นแบบอัตโนมัติและแฮ็กข้อความต่อไปนี้:

#!/usr/bin/perl                                                                                                                                                   

use strict;
use warnings;

my $result = system "ping -c1 -W1 192.168.1.1";

if ($result != 0) {
  print "No connectivity. Action required...\n";
  my $pid = `pgrep nm-applet`;
  if ($pid) {
    print "Killing current nm-applet instance $pid\n";
    system "kill $pid";
  }

  print "Starting nm-applet...";
  exec "nm-applet" or die "couldn't start nm-applet";

} else {
  print "Looks all fine. No action required\n";
}

การทดสอบครั้งแรกของฉันคือการฆ่า nm-applet ด้วยมือแล้วเรียกใช้สคริปต์ด้วยตนเอง มันตรวจไม่พบการเชื่อมต่อและเพียงแค่ "morphs" ไปยัง nm-applet เช่นเดียวกับที่ตั้งใจไว้

ตอนนี้การทดสอบเดียวกัน แต่ดำเนินการโดยงาน cron ต่อไปนี้:

*/1 * * * * /home/joe/netcheck.pl >> /home/joe/netcheck.log &

เอาต์พุตใน netcheck.log เป็นเพียง "กำลังเริ่มต้น nm-applet ... " แต่ไม่ได้เริ่มต้น กระบวนการจะตายทันที

ความช่วยเหลือหรือวิธีการแก้ปัญหาอื่น ๆ อาจชื่นชม


#! / เรา / bin / Perl?
Richie Marquez

@ Rich: ตาดี แต่ฉันคิดว่าถ้าสคริปต์ได้รับเท่าที่ "เริ่ม nm-applet ... " นั่นคือการพิมพ์ผิด
Telemachus

คำตอบ:


2

ตามที่ทุกคนที่ตอบแล้วชี้ให้เห็น cron รันคำสั่งในสภาพแวดล้อมที่น้อยมาก ฉันขอแนะนำให้คุณลองทำตามลำดับ:

  1. ใช้เส้นทางแบบเต็มสำหรับการโทรใด ๆ ที่เกิดขึ้นในสคริปต์
  2. ในรายการ crontab ให้รันสคริปต์อย่างชัดเจนโดยใช้ Perl

    / usr / bin / perl /home/joe/netcheck.pl

  3. จับทั้งเอาต์พุต stdoutและstderrของสคริปต์

    / usr / bin / perl /home/joe/netcheck.pl 1> /home/joe/netcheck-stdout.log 2> /home/joe/netcheck-stderr.log &

  4. แทนที่exec "nm-applet"ด้วยexec "ls"หรือคำสั่งง่ายๆอื่น ๆชั่วคราวเพื่อตรวจสอบว่าปัญหาเกิดขึ้นกับสภาพแวดล้อมที่ nm-applet คาดหวังไม่ใช่ด้วยตัวสคริปต์เอง

  5. ตรวจสอบว่าการดำเนินการnm-applet –sm-disableช่วย
  6. หากคุณยังคงติดอยู่ให้รันstrace nm-appletแทนเพื่อติดตามการโทรของระบบ เรียกใช้สิ่งนี้ตามปกติและภายใน cron เพื่อระบุการโทรที่บันทึกจะแตกต่างกัน ตรวจแก้จุดบกพร่องจากจุดนั้น

ต้องบอกว่านี้ฉันไม่แปลกใจที่เห็น nm-applet ล้มเหลวในการทำงานอย่างถูกต้องจากภายใน cron มันอาจต้องการความช่วยเหลือในการเข้าถึงไลบรารีดิสเพลย์และคำพังเพยที่หายไปจากสภาพแวดล้อม cron งานที่อาจจะดีกว่า แต่ก็ไม่เหมาะ ฉันแนะนำและใช้wicdแทนหากคุณต้องการเชื่อมต่อใหม่จากงาน cron


ดีฉันจะตรวจสอบ wicd
zedoo

ติดตั้ง wicd ดูเหมือนเนียนมาก
zedoo

1

Cron ทำงานภายใต้สภาพแวดล้อมที่น้อยที่สุด ระบุพา ธ ที่ครบถ้วนและชัดเจนสำหรับคำสั่งเชลล์ทั้งหมด (เช่น/sbin/pingแทนpingและอื่น ๆ - ตรวจสอบว่ารายการใดที่เกี่ยวข้องกับรายการแรกwhereis pingและต่อ ๆ ไป) และมันน่าจะทำงานได้ดี


ไม่มีผลกระทบ
zedoo

1

โดยทั่วไปคุณไม่สามารถเริ่มแอพ GUI จาก cron ได้เนื่องจาก cron ไม่มีสภาพแวดล้อมเดสก์ท็อปจอแสดงผล ฯลฯ

ลองใช้ cron

*/1 * * * * export DISPLAY=:0 && /home/joe/netcheck.pl >> /home/joe/netcheck.log &

หรือแทนที่จะตั้งค่า DISPLAY ใน crontab ให้ลองตั้งค่าในสคริปต์เอง ฉันไม่แน่ใจว่าจะใช้วิธีใด


คุณอาจต้องทำเรื่องน่าเบื่อกับ xauth ด้วย
David Mackintosh

ฟังดูสมเหตุสมผล ผมคิดว่าปัญหาที่แท้จริงที่นี่เป็นที่สภาพแวดล้อมเครือข่ายของฉันมีการจัดการโดยโปรแกรมคอมพิวเตอร์ ..
zedoo

0

ในสคริปต์ของคุณลองทิ้งระบบ PATH ก่อนการเรียก "exec nm-applet" nm-applet มีอยู่ใน / usr / bin บนระบบของฉันและฉันไม่สามารถจินตนาการเส้นทางเริ่มต้นที่ไม่มี / usr / bin แต่มีสิ่งแปลก ๆ เกิดขึ้น


ฉันเปลี่ยนอาร์กิวเมนต์ exec เป็นพา ธ สัมบูรณ์ ไม่เปลี่ยนแปลงอะไรเลย
zedoo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.