скрипт bash не работает, как ожидалось, когда выполняется cron [duplicate]

NullPointerException s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException. Они наиболее распространены, но другие способы перечислены на странице NullPointerException javadoc.

Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException, be:

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

В первой строке внутри main я явно устанавливаю ссылку Object obj равной null. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.

(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)

7
задан Reid Spencer 23 October 2014 в 16:31
поделиться

2 ответа

Вероятно, вам нужно сообщить cron, что оболочка для использования - оболочка bash, по умолчанию она соответствует sh. Вы можете сделать это для всех записей crontab, поместив эту строку в свой crontab:

SHELL=/bin/bash

Обратите внимание, что это приведет к запуску всех скриптов в crontab под bash, которые могут быть не такими, какие вы хотите. Если вы хотите изменить линию crontab, чтобы просто запустить bash, измените ее на это:

* * * * 1-5 root /bin/bash /home/xxxxxx/jmeter/VerificationService-0.0.1-SNAPSHOT/jmeter-cron-randomise.sh >> /home/xxxxxxx/jmeter/VerificationService-0.0.1-SNAPSHOT/cron.log 2>&1

Обратите внимание, что я также вызвал запись stderr в файл cron.log (2> & amp; 1), который может быть не таким, каким вы хотите, но довольно распространенной практикой. Это может помочь вам дополнительно диагностировать ошибки из сценария.

13
ответ дан Reid Spencer 19 August 2018 в 07:47
поделиться
  • 1
    Это почти правильно: это может быть /bin/bash, или это может быть /usr/bin/bash или что угодно. Интересно отметить, что реальный полный путь можно получить с помощью which bash. – fedorqui 23 October 2014 в 16:42
  • 2
    Благодарю. возвращаясь к использованию записи crontab через crontab -e для пользователя root и сталкиваясь с исходной проблемой, теперь я вижу полезные сообщения об ошибках ------ Запуск сценария jmeter-cron-randomiser min = 1 random = 1933 rmin = 0 / bin / sh: 1: root: not found / bin / sh: 1: root: not found / bin / sh: 1: root: not found – kal 23 October 2014 в 18:28
  • 3
    спасибо @viritude. Общая проблема решена путем редактирования / etc / crontab. – kal 23 October 2014 в 18:48
  • 4
    @fedorqui - Хотя это верно, путь уже был известен. Кал сказал, что это был / bin / bash в его первом комментарии к этому вопросу. – Reid Spencer 23 October 2014 в 22:44

В случае, если это кому-то поможет: для меня это было связано с тем, что я закончил с окончанием строки «DOS» (CR-LF) вместо окончаний строк «unix» (LF). Это можно проверить с помощью od или вашего любимого инструмента шестнадцатеричного дампа, например:

od -c <script_file>

... и искать\r\n вместо просто\n.

Кажется (и эта статья поддерживает его), что символ CR останавливает работу «shebang», потому что интерпретируется как часть имени исполняемого файла оболочки.

(Окончания строк появились, потому что файл поступал из репозитория git и был передан через машину Windows).

1
ответ дан Community 19 August 2018 в 07:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: