LINUX.ORG.RU

crontab скрипт

 ,


0

1

Доброго дня!

редос: суть проблемы: имеется принтер - в политике слетает галка «разрешен». Необходимо галку ставить - перепроверять раз в 5-10 сек и ставить галку.

Справляюсь так - в терминале, сначала пароль su, далее - cupsenable HP-LaserJet-Professional-P1102 <=== галка ставиться без проблем.

Делаю скрипт:

PrinterEnable.sh

#!/bin/sh cupsenable HP-LaserJet-Professional-P1102

открываю crontab -e *****PrinterEnable.sh

Должно галка ставиться каждую минуту (путь хоть не 5-10 сек, а мин., перетерплю) - но… ничего не происходит.

Как понять где что не так делается?

Заранее спасибо!

С редосом только знакомлюсь, прошу сильно камнями не кидаться.

Ответ на: комментарий от anonymous

Тут все просто - боролся с WMware - не устанавливается виртуальный принтер, в моей версии его просто нет. На вм установлена винда. Сетевой тоже не вариант ставить - офисный комп, вся сеть через админов. При переброске принтера слетает галка. Если в вм отключаю принтер, он автоматом в редосе не включается, приходится ручками перезапускать.

Excalibug
() автор топика
Ответ на: комментарий от mord0d

Какой выход тогда? Как выполнять команду cupsenable HP-LaserJet-Professional-P1102, раз в 10 сек? Может в лазарусе проще будет, чем писать скрипт?

что то типа

SetPrivelegies …

While True Do Begin Sleep (10000); Execute (‘cupsenable HP-LaserJet-Professional-P1102’, … End;

Excalibug
() автор топика
Ответ на: комментарий от Excalibug

Может в лазарусе проще будет, чем писать скрипт?

Если ты это так же засунешь в crontab, это всё равно работать не будет. Ни на Lazarus, ни на C++, ни на Java. Окружение всё равно будет отличаться.

Правильным решением будет подсунуть в скрипт нужное окружение (но учти, что оно может между перезагрузками отличаться).

mord0d ★★★★★
()

в политике слетает галка «разрешен».

Вот, нужно выяснить отчего так. Тогда и костыли не понадобятся. Но тут уж я не помощник.

#!/bin/sh cupsenable HP-LaserJet-Professional-P1102

См. lorcode для оформления исходников.

Чётко и сразу нужно установить, что в командной оболочке многое зависит от переменных окружения. В частности, содержимое PATH может сильно меняться (и вообще отсутствовать). Поэтому лучше или установить правильное значение, или писать полный путь к исполняемому файлу.

но… ничего не происходит.

Отладочная печать ваш друг. Что-нибудь типа cmd 2>&1 | tee --append /tmp/debug.log поможет выяснить как конкретно скрипт не работает.

ugoday ★★★★★
()
Ответ на: комментарий от ALiEN175
'''
# Printer configuration file for CUPS v2.4.7
# Written by cupsd
# DO NOT EDIT THIS FILE WHEN CUPSD IS RUNNING
NextPrinterId 4
<DefaultPrinter HP-LaserJet-Professional-P1102>
PrinterId 3
UUID urn:uuid:9857dbfc-16f8-37ba-4693-e527e8e06274
Info Hewlett-Packard HP LaserJet Professional P1102
Location organization
MakeModel HP LaserJet Pro P1102 Foomatic/foo2zjs-z2 (recommended)
DeviceURI hp:/usb/HP_LaserJet_Professional_P1102? 
serial=000000000Q84G1Q2SI1c
State Stopped
StateMessage Paused
StateTime 1752535213
ConfigTime 1752535213
Reason paused
Type 8425476
Accepting Yes
Shared Yes
JobSheets none none
QuotaPeriod 0
PageLimit 0
KLimit 0
OpPolicy default
ErrorPolicy retry-job
Option copies 0
Option cpi 9.8
Option fitplot True
Option scaling 99
</DefaultPrinter>
<Printer HP-LaserJet-Professional-P1102-2>
...
</Printer>

'''

что то никак коды не вставляются

Excalibug
() автор топика
Ответ на: комментарий от ALiEN175
я знаю что остановлен. Он останавливается после того, как перебрасываю его в вм с виндой. Когда отключаю его от винды, он не работает в редосе, приходится ручками галку ставить в политике "разрешен" и все прекрасно работает. 
Мне то и нужно, эту галку автоматом ставить. Причем, если принтер проброшен в винду (гость) и ставлю галку "разрешен" в хосте (редосе) его гость не отдает, пока его не отцеплю. 
Excalibug
() автор топика
Ответ на: комментарий от Excalibug

Он останавливается после того, как перебрасываю его в вм с виндой.

ну и где эта информация в начальном посте? Естественно, останавливается - принтера-то нет, а USB есть.

Разбирайся с гипервизором - как корректно заставить его работать с перетыканием USB. И не лишним будет сообщить, что там у тебя крутится - Qemu, Vmware, Vbox?

ALiEN175
()
Последнее исправление: ALiEN175 (всего исправлений: 3)

как тебе пишут окружение разное у скрипта и в частности переменная PATH, а в случае crontab надо указывать полный путь до исполняемых файлов, и советуют что бы пароль у sudo для определённой команды не требовало задай чтото по типу:

username ALL=(ALL) NOPASSWD: /usr/bin/cupsenable
в файле например /etc/sudoers.d/мое_sudo

s-warus ★★★★
()
Ответ на: комментарий от Excalibug

Ну вообще-то без разницы, в чьём ведении сеть. Можно свою сделать.

Напрашивается другой вопрос - а чего это эти админы не занимаются проблемой, озвученной в теме? Или вы кружок самодеятельности решили организовать?

ALiEN175
()
Ответ на: комментарий от ALiEN175

Разбирайся с гипервизором - как корректно заставить его работать с перетыканием USB.

Напрямую никак, скорее всего. Но, теоретически, можно расшарить принтер как сетевой только для виртуальной машины.

Vidrele ★★★★★
()

Оффтопик

Имеется глупый вопрос (раз попалась тема по крону): разница между 00/2 и */2,а ещё почему некоторые онлайн конвертеры принимают один из вариантов, а другой отвергают как ошибку?

anonymous
()
Ответ на: комментарий от anonymous

Совсем не глупый вопрос! Это часто путают, потому что синтаксис cron может быть тонко капризным, особенно в разных реализациях (crontab, systemd, Quartz, AWS и т.д.).

Давай разберёмся:


✅ Разница между */2 и 00/2

ВыражениеЗначениеПоддержка
*/2Каждые 2 единицы (минуты, часы и т.д.), начиная с 0✅ везде
00/2Нестандартное, зависит от реализации: интерпретируется как 0/2, но может быть отвергнуто❌ не везде

🔍 Что такое */2

*/2 * * * *  # Каждые 2 минуты: 0, 2, 4, 6, 8, ..., 58
  • * — означает «всё»,
  • */2 — «каждое второе значение».

Это абсолютно стандартно и работает во всех cron-реализациях.


🔍 Что такое 00/2

00/2 * * * *  # Это может быть ошибкой!
  • С точки зрения логики, 00/2 = 0/2, то есть от нуля через 2.
  • Но 00 с ведущим нулём — неправильный синтаксис во многих реализациях, особенно POSIX.

📛 Почему одни парсеры принимают 00/2, а другие — нет?

📦 Разные реализации cron:

РеализацияПоддержка 00/2
Vixie cron (Fedora/Debian)❌ ошибка синтаксиса
cronie❌ ошибка
Quartz (Java)✅ часто работает
systemd.timer❌ вообще другой синтаксис
Онлайн-парсеры🤷 часть имитирует POSIX cron, часть — Quartz

✅ Как правильно писать?

Всегда используй */2, 0/5, 5-45/10 и т.п. — без ведущих нулей.


💡 Советы:

  • Всегда тестируй cron-выражения на том cron, где будешь запускать.

  • Если делаешь cron в скрипте, проверяй синтаксис:

    crontab -l
    
  • Онлайн-конвертеры (например, crontab.guru) часто заточены под POSIX, а не под все вариации cron.


Если хочешь — могу разобрать конкретное выражение из твоего кронтаба.

MoldAndLimeHoney ★★
()
Ответ на: комментарий от s-warus

Вместо того чтобы крон запускал задание от юзера, который в свою очередь запускает sudo, который надо ещё настраивать чтобы он не спрашивал пароль, намного проще и чище просто добавить это задание сразу руту.

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

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 2)
Ответ на: комментарий от Excalibug

Советы про то чтобы указать полный путь к проге ты учёл? И задание в кронтабе какого юзера?

Что касается интервала меньше минуты, то направление мысли у тебя правильное, но обычно такие вещи шеллом делают. Можно как задание в крон

#!/bin/sh

/usr/sbin/cupsenable HP-LaserJet-Professional-P1102
sleep 10
/usr/sbin/cupsenable HP-LaserJet-Professional-P1102
sleep 10
/usr/sbin/cupsenable HP-LaserJet-Professional-P1102
sleep 10
/usr/sbin/cupsenable HP-LaserJet-Professional-P1102
sleep 10
/usr/sbin/cupsenable HP-LaserJet-Professional-P1102
sleep 10
/usr/sbin/cupsenable HP-LaserJet-Professional-P1102
(повторить 6 раз и выйти, а потом крон следующую итерацию запустит).

Или можно куда-нить в системный автозапуск в виде скрипта-демона

#!/bin/sh

while true; do
  /usr/sbin/cupsenable HP-LaserJet-Professional-P1102
  sleep 10
done >> /dev/null 2>&1 &

вместо >> /dev/null можно редирект логов в другое место или вообще не редиректить в зависимости от способа запуска этого скрипта. Второй вариант заодно не будет спамить бесполезными логами запуска задания каждую минуту в /var/log/auth.log, а так же не имеет опасности наспамить кучу процессов cupsenable если они почему-то начнут долго выполняться.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 2)