Виведення журналу фонового або завантажувального сценарію


10

У мене є короткий сценарій, який виконується системним демоном для конкретних подій. Я знаю, що подія відбувається і сценарій виконується, але це не робить те, що я маю намір. Як не дивно, це робиться, коли я його запускаю вручну, тому я дуже розгублений.

Як я можу зрозуміти, що відбувається? Сценарій - це в основному ряд команд, таких як:

/bin/foo on 3
sudo bar a

Я розумію, це покликане бути підручником з налагодження системних сценаріїв, але це теж трохи U&L. Я неправильно прочитав заголовок і запропонував би "Реєстрація виводу системного сценарію для налагодження" зробить мету яснішою. Також мій мозок замерзає, коли я читаю ці foo barприклади, я віддаю перевагу тому, що виглядає більш реальним світом. Я не хочу редагувати будь-яку публікацію, тому залишаю це вам, якщо ви думаєте, що її можна вдосконалити.
Міллівей

1
@Milliways Ви маєте рацію, "системний скрипт" все одно був неправильним явищем, тому я змінив назву. Я не погоджуюся з тим, що стосується foobar - люди повинні навчитися розпізнавати поширені мовні / розмовні так само, як це можливо в будь-якій культурі. Крім того, це все ще хороший хихикання, коли ви складете їх разом.
goldilocks

Відповіді:


8

По-перше, якщо сценарій працює за допомогою системного демона і цей демон працює з кореневими привілеями, вам не потрібно використовувати sudo. Сюди входить initsystemd), що включає 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

Зверху (або де завгодно, і це стосуватиметься всього, що наступне).


2

Один важливий аспект, який люди, як правило, забувають при виконанні сценаріїв як демони - це середовище оболонки, $PATHзокрема змінна. У вашому прикладі другий рядок покладається на $PATH: повне ім'я - sudoце /usr/bin/sudo, а ваша оболонка користувача це знає лише тому, що йому було наказано шукати /usr/binпід час пошуку виконавчих файлів. Те саме стосується і для bar.

Враховуючи, що sudoце не потрібно при запуску скриптів як демон, ваш другий рядок повинен виглядати так:

/path/to/bar a
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.