Разбить длинную команду на несколько строк

Если ваш скрипт запускается из командной строки, а не из cron, есть два обычных подозреваемых:

  1. PATH для cronотличается от вашего пути в качестве «обычного» пользователя. Вы можете решить эту проблему, используя спецификацию полного пути для вашего скрипта :
  2. .
@reboot python3 /full/path/to/myscript.py 
  1. cronне знает о состоянии каких-либо служб при запуске. Для cron@rebootозначает, когда запускается cron, а не когда сеть работает или какие-либо другие службы, которые могут потребоваться для вашего задания cron. Один из способов позаботиться об этом — sleepнемного перед запуском скрипта:
@reboot (sleep 30; python3 /full/path/to/myscript.py)  

Это задержит выполнение вашего скрипта на 30 секунд. Ничего волшебного в 30 секундах... это зависит от вашей системы. Вы можете провести несколько проб и ошибок, чтобы найти надежное время сна.

Обратите внимание, что другим подходом, позволяющим избежать недостатков cronв отношении состояния системных служб, является использование systemd. Некоторые (, в том числе и я, )находят cronболее простым в использовании, но, безусловно, systemdимеет некоторые преимущества.

Наконец, обычно рекомендуется собирать все сообщения об ошибках, сгенерированные при запуске скрипта. Еще одно дополнение к единственной строке в вашем crontabсделает это:

@reboot (sleep 30; python3 /full/path/to/myscript.py >> /home/yours/cronjoblog) 2>&1

Любые сообщения об ошибках из stderrбудут добавляться к указанному вами файлу.

2
25.06.2020, 10:58
2 ответа

Это называется продолжением и использует \как самый последний символ в каждой строке, кроме последней:

#!/bin/sh
sh../jboss/bin/standalone.sh         \
  --server-config=standalone-full.xml \
  -Djboss.node.name=node1             \
  -b 0.0.0.0                          \
  -bmanagement 0.0.0.0

(выровнены для косметических целей, они не обязательно должны быть ).

Подробнее об этом см. Синтаксис оболочки :Как правильно использовать \ для разрыва строк? и связанные вопросы.

7
28.04.2021, 23:12

Работа над идеей Пола _Комментарий Педанта, в Bash/ksh/zsh можно использовать массив:

#!/bin/bash
args=(
  --server-config=standalone-full.xml
  -Djboss.node.name=node1
  -b 0.0.0.0
  -bmanagement 0.0.0.0
)
sh../jboss/bin/standalone.sh "${args[@]}"

Здесь круглые скобки предоставляют синтаксическую подсказку, которую должна знать оболочка, когда заканчивается назначение массива. К сожалению, это работает только с назначением массива, а не только с одной командой.

Кроме того, если сценарий jboss правильно настроен с разрешениями на выполнение и хэш-бангом в сценарии, вы сможете запустить его просто как ../standalone.shбез явного shвпереди.

3
28.04.2021, 23:12

Теги

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