Иногда у меня возникают проблемы с тем, что задания cron не выполняются, и диагностирование может быть затруднено. Что было бы полезно, так это переключиться на того же пользователя, под которым выполняются задания cron, чтобы я мог видеть, есть ли проблема с разрешениями или что-то в этом роде. Может кто-нибудь сказать мне, как это сделать? Моя версия для Linux, от uname -r , является 2.6.32-36-generic

ура, макс

РЕДАКТИРОВАТЬ - кстати, я знаю, как переключать пользователей! Мой вопрос больше касается выяснения, на какого пользователя переключаться.

РЕДАКТИРОВАТЬ - в моей текущей проблеме у меня есть строка в crontab, которая работает, когда я вставляю ее в терминал (в любую папку), но не работает при запуске из cron. Я пытаюсь понять, почему. Я даю полный путь к любым используемым файлам.

42 13 * * * cd /path/to/my/working/folder && /path/to/my/working/folder/script/runner 'MusicService.update_cached_data' -e staging

(Время 42 13 там, потому что это последний раз, когда я проверял это)

2 ответа2

5

Cronjobs запускаются как пользователь, настроивший crontab. Они не запускаются как специальные пользователи. Обычно, если вы знаете, что существует crontab, вы знаете, кто его создал. Вы можете увидеть crontabs текущего пользователя, запустив

crontab -l

Вы можете найти пользовательские crontabs в каталоге /var/spool/cron/crontabs/ . У каждого пользователя, который создал crontab, будет файл (имя которого является именем пользователя) в этом каталоге. По умолчанию эти файлы доступны для чтения только пользователю, который их создал, поэтому вы не можете их cat не поигравшись с их разрешениями.

Этот небольшой скриптлет перечислит все команды cron для каждого пользователя:

for u in $(find /var/spool/cron/crontabs/ -type f); do 
 user=`basename $u`; 
 echo "------- $user ----"; 
 crontab -u  $user -l | grep -v "#"; 
done

Это перечислит все cronjobs для каждого из пользователей, которые имеют файл crontab в /var/spool/cron/crontabs/ .

Наконец, у вас также есть общесистемные crontabs, которые находятся в /etc/crontab которые вы можете увидеть, запустив cat /etc/crontab .


В ответ на ваш комментарий, если вы хотите загрузить определенные переменные, которые определены в данном файле, вы можете source , что файл в crontab

42 13 * * * . ~/.bashrc && cd /path/to/my/working/folder && /path/to/my/working/folder/script/runner 'MusicService.update_cached_data' -e staging

То . сопровождаемый файлом, который вы хотите загрузить.


Наконец, вот некоторая соответствующая информация от man 5 crontab :

   An active line in a crontab will be either  an  envi‐
   ronment  setting or a cron command.  The crontab file
   is parsed from top to bottom, so any environment set‐
   tings  will  affect only the cron commands below them
   in the file.  An environment setting is of the form,

       name = value

   where  the  spaces  around  the  equal-sign  (=)  are
   optional,  and  any  subsequent non-leading spaces in
   value will be part of the  value  assigned  to  name.
   The  value  string may be placed in quotes (single or
   double, but matching) to preserve leading or trailing
   blanks.  To  define an empty variable, quotes must be
   used. The value string is not parsed for  environmen‐
   tal  substitutions  or replacement of variables, thus
   lines like

       PATH = $HOME/bin:$PATH

   will not work as you might expect.

   An alternative for setting up the  commands  path  is
   using  the  fact  that  many  shells  will  treat the
   tilde(~) as substitution of $HOME, so if you use bash
   for your tasks you can use this:

        SHELL=/bin/bash
        PATH=~/bin:/usr/bin/:/bin

   [...]

   Several  environment  variables  are set up automati‐
   cally  by  the  cron(8)  daemon.   SHELL  is  set  to
   /bin/sh,  and  LOGNAME  and  HOME  are  set  from the
   /etc/passwd line of the crontab's owner. PATH is  set
   to  "/usr/bin:/bin".   HOME,  SHELL,  and PATH may be
   overridden by settings in the crontab; LOGNAME is the
   user  that  the  job  is running from, and may not be
   changed.

   [...]

   On the Debian GNU/Linux  system,  cron  supports  the
   pam_env  module,  and loads the environment specified
   by /etc/environment  and  /etc/security/pam_env.conf.
   It     also    reads    locale    information    from
   /etc/default/locale.  However, the  PAM  settings  do
   NOT  override  the  settings  described above nor any
   settings in the crontab file itself. Note in particu‐
   lar   that   if   you   want   a   PATH   other  than
   "/usr/bin:/bin", you will  need  to  set  it  in  the
   crontab file.
0

Почему бы вам не настроить пользователя для запуска этого конкретного cronjob самостоятельно? например:

42 13 * * * root cd /path/to/my/working/folder && ...

эта работа будет выполняться от имени root ... Если вы вошли на работу в /etc /crontab

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .