Нет ничего плохого Это работает как задумано. * сбрасывается в начале каждого часа / дня / месяца. Другими словами, * является заменой для максимального диапазона рассматриваемого значения. Таким образом, * в столбце минут обозначается 0-59, а * / 40 означает «начиная с 0, запускать каждые 40 минут до 59». Смотрите 'Специальные символы' на странице cron Wikipedia для получения дополнительной информации.
Что вам, вероятно, нужно сделать, это запускать работу каждые 20 минут, и программа должна решить, должна ли она выполняться. Или сделать это с двумя строками
0,40 0,2,4,6,8,10,12,14,16,18,20,22 * * * myshellcommand
20 1,3,5,7,9,11,13,15,17,19,21,23 * * * myshellcommand
Обратите внимание, что это можно записать в несколько более компактной форме:
0,40 */2 * * * myshellcommand
20 1-23/2 * * * myshellcommand
В этом случае */2 обозначает каждый второй час, начиная с 0 (поскольку * эквивалентно 0-23), а 1-23/2 обозначает каждый второй час, начиная с 1-го часа.