моя настройка беспроводной сети не работает несколько раз в день, помогает перезагрузка сетевого менеджера gnome. Я хочу автоматизировать это и взломал следующий perlscript:

#!/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-апплет вручную и запустить скрипт вручную. Он не обнаруживает подключения и просто "превращается" в nm-апплет, как и предполагалось.

Теперь тот же тест, но выполняемый следующим заданием cron:

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

Вывод в netcheck.log - это просто «Запуск nm-applet ...», но он не запускается. Процесс просто умирает сразу.

Любая помощь или, возможно, другое решение приветствуется.

4 ответа4

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-апплет не работает должным образом из cron. Вероятно, ему нужен доступ к библиотекам display и gnome, которые отсутствуют в среде cron. На работе может быть лучше, но даже это не идеально. Я бы порекомендовал использовать wicd, если вам нужно восстановить соединение с заданием cron.

1

Cron работает в очень минимальной среде. Укажите явные, полные пути для всех команд оболочки (например, /sbin/ping вместо ping и т.д. - проверьте, где сначала находятся соответствующие элементы, whereis ping и т.д.), И он, вероятно, будет работать нормально.

1

Вообще говоря, вы не можете запускать приложения с графическим интерфейсом из cron, поскольку у cron нет среды, рабочего стола, дисплея и т.д.

Попробуйте это в cron

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

или вместо установки DISPLAY в crontab, попробуйте установить его в самом скрипте. Я не уверен, какой путь будет работать.

0

В своем скрипте попробуйте вывести системный PATH перед вызовом exec nm-applet. nm-applet существует в /usr /bin в моей системе, и я не могу представить, что PATH по умолчанию не содержит /usr /bin, но произошли странные вещи.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .