Я бы рассмотрел два подхода
Оставьте планирование нетронутым, но запустите все cron
задания подnice
и, возможно, дажеionice
:
0 * * * * root ionice -c3 nice /some/command and parameters
Запретить любые cron
задания в определенное время. Помните, что любой пользователь, который может создать (или удалить )файл флага, может контролировать этот подход. Это может сработать, если вы хотите настроить игровой режим по запросу , добавив команды touch
и rm
в сценарий запуска -вашей игры. (Возможно, вам придется использовать /tmp
, а не /var/run
, но тогда это тривиально открыто для любого пользователя.)
0 18 * * * root touch /var/run/no_cron
0 19 * * * root rm -f /var/run/no_cron
0 * * * * root test ! -f /var/run/no_cron && /some/command...
После настройки ни один из подходов не требует root-доступа. Более того, вы можете заранее решить, какие работы подлежат такому контролю, а какие нет.
Может, так и пойдет:
bash -c '. /path/to/unmodifiable' /fake/path args...
Очевидно, /path/to/unmodifiable
должен быть скриптом оболочки; этот глупый трюк не будет работать с другими типами исполняемых файлов. Это также не будет работать с zsh
(, но будет работать с другими оболочками, такими как dash
, ksh
и т. д. ).
Если вам нужно вызвать вместо вызова немодифицируемого скрипта, вы можете использовать тот же прием из оболочки, вызывающей ваш внешний скрипт, или сделать так, чтобы он -вызывал сам себя:
$ cat unmodifiable
#! /bin/sh
printf '{%s} ' "$0" "$@"
echo
$ cat becoming
#! /bin/sh
[ "$MYSELF" ] || MYSELF=$0 exec sh -c '. "$MYSELF"' "I'm the mountain!" "$@"
../unmodifiable
$ chmod 755 becoming
$./becoming 1 2 3
{I'm the mountain!} {1} {2} {3}
Вы не можете «обмануть» дочерний скрипт, но вы можете вызвать его через другое имя, создав символическую ссылку на вызываемый скрипт и вызвав символическую ссылку. Я верю, что это позволит достичь цели, которую вы ищете.
Пример:
$ cat./bin/script.sh
echo $0
$./bin/script.sh
./bin/script.sh
$ ln -s bin/script.sh foo.sh
$./foo.sh
./foo.sh