Я не прочитал в описании вашей проблемы ничего, что мешало бы вам создавать разные учетные записи пользователей для приложений. Затем вы можете использовать тривиальные права доступа к файлам для предотвращения помех :
.chown app1 /var/lib/myapps/app1
chmod 700 /var/lib/myapps/app1
sudo -u app1 /var/lib/myapps/app1/run.sh
редактировать
Если оценщик работает как root
, он может просто запускать приложения через sudo
.
Если оценщик не запускается как root
, тогда приложения, которые он вызывает (обычным способом ), могут быть установлены с битом SUID (, установленным идентификатором пользователя ), чтобы процесс выполнялся как пользователь, которому принадлежит двоичный файл, а не как пользователь процесса оценки.
Собрав воедино некоторые комментарии выше, с датой GNU вы можете проверить, будет ли завтра первый день месяца с помощью:
if [[ "$(date -d tomorrow +%d)" == "01" ]]; then
echo "Tomorrow is the first day of the month"
fi
Если вы хотите узнать, последний ли день месяца завтра, вы можете аналогичным образом:
if [[ "$(date -d "2 days" +%d)" == "01" ]]; then
echo "Tomorrow is the last day of the month"
fi
Возможно, ваша проблема связана с тем, что ваш местный часовой пояс на самом деле не соответствует UTC. Лучший способ получить смещение времени с помощью GNU date
— это использовать его опцию -d
с аргументом, описывающим дату, которую вы хотели бы использовать в качестве ссылки, вместо «сейчас» (, как показано в Энди. ответ). Если вы дополнительно хотите получить ответ в формате UTC от GNU date
, используйте его опцию -u
.
Без использования GNU date
, в bash
версии 4.3+:
#!/bin/bash
# Unix timestamp "now"
printf -v now '%(%s)T' # append "-1" as argument to get it working in bash 4.2
# Today's weekday, 1-7, 1=Monday
printf -v today_day '%(%u)T' "$now"
# Tomorrow's date, 1-31
printf -v tomorrow_date '%(%e)T' "$(( now + 24*60*60 ))"
if [ "$tomorrow_date" -eq 1 ]; then
echo Today is the last day of the month
elif [ "$today_day" -eq 7 ]; then
echo Today is Sunday
else
echo Today is some other day
fi