Обычно, когда что-то не работает в соответствии с планом при запуске через cron, но работает нормально, когда вы пробуете это в терминале, проблемы вызваны одной из двух возможных причин:
- Cron не имеет $ PATH (или, в более общем смысле, среды), к которой вы привыкли или ожидаете. В некоторой степени это можно решить, просто указав полный путь ко всему, задав соответствующие переменные среды внутри cron или в сценарии, который вы запускаете через cron и который может выполнить любую необходимую настройку перед выполнением настоящей команды.
- cron не запускает команды через TTY. Многие вещи не заботятся и возвращаются к нормальному выходному формату, если они запускаются без подключенного TTY, но некоторые вещи все равно.
top
по умолчанию заботится и должен сказать, что это не важно. Я не знаю, выделяет ли Python os.popen()
TTY, но я несколько сомневаюсь в этом.
В вашем конкретном случае вы можете обойти эту проблему, добавив параметр -b
top
. Как описано в справочной странице:
-b: работа в пакетном режиме
Начинает top в режиме 'Batch', что может быть полезно для отправки вывода сверху в другие программы или в файл. В этом режиме top не принимает ввод и запускается до тех пор, пока не будет установлен предел итераций, заданный параметром командной строки '-n', или пока он не будет уничтожен.