По-перше, якщо сценарій працює за допомогою системного демона і цей демон працює з кореневими привілеями, вам не потрібно використовувати sudo
. Сюди входить init
(і systemd
), що включає rc.local
. Якщо цей демон не працює з кореневими привілеями, він sudo
не працюватиме, якщо /etc/sudoers
не налаштовано дозволити таке (і без пароля). Користувачів Raspbian це може збентежити, оскільки pi
користувачеві дозволено робити що-небудь за замовчуванням (і якщо ви заглянете в нього, /etc/sudoers
ви побачите, як це досягнуто).
Далі ви можете зафіксувати вихід з будь-якого bash
скрипту або будь-якого набору команд всередині bash-скрипту, виконавши їх у підрозділі так: 1
(
/bin/foo on 3
sudo bar a
) &> /var/log/myTestLog.txt
()
Вказує подоболочкі . Весь вихід із всього, що знаходиться всередині цього, переспрямовується у /var/log/myTestLog.txt
файл. Кілька приміток:
&>
є башизмом , тому якщо сценарій виконується через шебанг на першому рядку, він повинен бути #!/bin/bash
, а не просто /bin/sh
. "Башизми" працюють лише в bash
оболонці.
Сюди входить те /etc/rc.local
, що за замовчуванням використовує /bin/sh
(тобто, так, ви можете сміливо змінити це на /bin/bash
).
/var/log
вимагає кореневих привілеїв для запису. Якщо процес не має такого, використовуйте або створіть каталог, який ви знаєте, що це може. Якщо ви сумніваєтесь, якщо ви можете перевірити це, не вимикаючи або перезавантажуючи систему, використовуйте те /tmp
, що можна записати у всьому світі (тобто ким-небудь). Однак /tmp
не зберігається через чоботи. Це також невеликий розділ на базі оперативної пам’яті, тому не записуйте на нього гіги даних. Це не ваша SD-карта [насправді в поточних версіях Raspbian вона є, але на практиці не розраховуйте на це] .
&>
замінить що-небудь у myTestLog.txt
. Якщо замість цього ви хочете додати до існуючого журналу, що може бути хорошою ідеєю для налагодження, скористайтеся &>>
. Потім ви можете додати команду до початку цієї підпакеті так:
echo Starting $(date)
Щоб відокремити інформацію від кожного запуску. Якщо ви не впевнені, що це робить, спробуйте в командному рядку.
Останній пункт є хорошою ілюстрацією того, що ви можете зробити стосовно команд, які нічого не виводять, але більшість з них робиться, якщо ви включаєте, наприклад, -v
для "багатослівної". Остерігайтеся деяких команд -v
означає "друкувати інформацію про версію". Перегляньте команду на сторінці man, щоб переконатися, що і як це буде працювати (деякі команди також використовують інший перемикач, ніж -v
).
За умовою, команди також повертають значення 0, коли вони завершені. Іноді це називають "статусом виходу", і ви його зазвичай не бачите, але оболонка покаже вам echo $?
. Спробуйте
ls /
echo $?
ls /nonexistantdir
echo $?
Ви отримаєте 0 і 2. Якщо ви заглянете на сторінку чоловіка в ls
розділі "Вихід із статусу", ви побачите досить неспецифічний, загадковий:
2 if serious trouble (e.g., cannot access command-line argument).
Що може бути, а може і не бути кращим, ніж нічого, але там ви йдете.
Як мінімум, це вказує на те, що команда чомусь не вдалася. Статус виходу також дозволяє робити такі дії:
/bin/foo && sudo bar
У &&
цьому випадку означає "якщо перша команда успішна", припускаючи, що перша команда використовує умову повернення 0 (саме тому вони зазвичай роблять). Якщо /bin/foo
це не працює, не може бути знайдений тощо, то sudo bar
це ніколи не станеться.
Використання комбінації повідомлень про реєстрацію та умовного виконання ( &&
) має наблизитись до з'ясування проблеми чи принаймні отримання інформації, яка може бути корисною іншим, щоб допомогти вирішити проблему. Без цього найчастіше хтось може часто здогадуватися.
1. Ви можете виконати одне і те ж переадресацію виводу для всього сценарію зсередини, використовуючи:
exec &> /var/log/myTestLog.txt
Зверху (або де завгодно, і це стосуватиметься всього, що наступне).
U&L
. Я неправильно прочитав заголовок і запропонував би "Реєстрація виводу системного сценарію для налагодження" зробить мету яснішою. Також мій мозок замерзає, коли я читаю ціfoo
bar
приклади, я віддаю перевагу тому, що виглядає більш реальним світом. Я не хочу редагувати будь-яку публікацію, тому залишаю це вам, якщо ви думаєте, що її можна вдосконалити.