Perlscript berjalan dengan baik ketika dijalankan secara manual tetapi tidak di bawah cron


0

pengaturan nirkabel saya gagal beberapa kali sehari, memulai kembali membantu manajer jaringan gnome. Saya ingin mengotomatisasi ini dan meretas skrip perl berikut:

#!/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";
}

Tes pertama saya adalah hanya membunuh nm-applet dengan tangan dan menjalankan skrip secara manual. Itu tidak mendeteksi konektivitas dan hanya "morphs" ke nm-applet, seperti yang dimaksudkan.

Sekarang tes yang sama tetapi dijalankan oleh pekerjaan cron berikut:

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

Output di netcheck.log hanya "Memulai nm-applet ..." tetapi tidak memulai. Prosesnya langsung mati begitu saja.

Bantuan atau solusi lain yang mungkin dihargai.


#! / us / bin / perl?
Richie Marquez

@ Rich: Mata yang bagus, tapi saya berasumsi bahwa jika skrip mendapatkan sejauh "Mulai nm-applet ...". itu salah ketik.
Telemachus

Jawaban:


2

Seperti semua orang yang menjawab sudah menunjukkan, cron menjalankan perintah di lingkungan yang sangat minim. Saya sarankan Anda mencoba ini secara berurutan:

  1. Gunakan jalur lengkap untuk semua panggilan yang dibuat dalam skrip.
  2. Dalam entri crontab, jalankan skrip secara eksplisit menggunakan perl.

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

  3. Tangkap keduanya stdout dan stderr output dari skrip.

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

  4. Ganti sementara exec "nm-applet" dengan exec "ls" atau perintah sederhana lainnya untuk memeriksa bahwa masalahnya ada pada lingkungan yang diharapkan nm-applet, bukan dengan skrip itu sendiri.

  5. Periksa apakah mengeksekusi nm-applet –sm-disable membantu.
  6. Jika Anda masih macet, jalankan strace nm-applet alih-alih melacak panggilan sistem. Jalankan ini secara normal dan dalam cron untuk mengidentifikasi panggilan dari mana log berbeda. Debug dari titik itu.

Setelah mengatakan ini, saya tidak terkejut melihat nm-applet gagal dijalankan dengan benar dari dalam cron. Mungkin perlu akses ke tampilan dan pustaka gnome yang hilang dari dalam lingkungan cron. Suatu pekerjaan mungkin lebih baik, tetapi itu pun tidak ideal. Saya akan merekomendasikan menggunakan wicd alih-alih jika Anda perlu menyambung kembali dari pekerjaan cron.


bagus, saya akan periksa wicd.
zedoo

diinstal wicd, tampaknya sangat apik.
zedoo

1

Cron berjalan di bawah lingkungan yang sangat minim. Menyediakan jalur lengkap dan eksplisit untuk semua perintah shell (mis., /sbin/ping dari pada ping dan seterusnya - periksa di mana item yang relevan pertama kali whereis ping dan seterusnya), dan kemungkinan akan berjalan dengan baik.


Tidak berpengaruh.
zedoo

1

Secara umum, Anda tidak dapat memulai aplikasi GUI dari cron, karena cron tidak memiliki lingkungan, desktop, tampilan, dll.

Coba ini di cron

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

atau alih-alih mengatur DISPLAY di crontab, coba atur dalam skrip itu sendiri. Saya tidak yakin jalan mana yang akan berhasil.


Anda mungkin juga harus melakukan mucking yang membosankan dengan xauth juga.
David Mackintosh

Ini terdengar masuk akal. Saya kira masalah sebenarnya di sini adalah bahwa lingkungan jaringan saya dikelola oleh aplikasi desktop ..
zedoo

0

Dalam skrip Anda, coba dump sistem PATH sebelum panggilan "exec nm-applet". nm-applet ada di / usr / bin pada sistem saya, dan saya tidak dapat membayangkan PATH default tidak mengandung / usr / bin tetapi hal-hal aneh telah terjadi.


Saya mengubah argumen exec ke jalur absolut. Tidak mengubah apa pun.
zedoo
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.