Про атрибуты все уже сказали. Но если заливаете в /tmp, то там атрибуты исполнения могут сбрасываться или просто оттуда не запускаться, в зависимости от параметров монтирования /tmp!
tmpfs on /tmp type tmpfs (rw,nosuid,nodev,noexec)
Вот у меня - nosuid (запрещать suid бит), noexec (запрещать исполнение), nodev (запрещать дескрипторы устройств).
У меня процесс обновления происходит в несколько этапов
1) скрипт запуска приложения проверяет линк в /tmp/uploaded
- если есть, запускает приложение по этой ссылке с параметром --uploaded=path-to-new-version и удаляет саму ссылку (!)
- если нет - запускает приложение по стандартному месту
2) приложение проверяет по ключу --uploaded свой функционал и если все хорошо, делает линк на текущую версию на стандартное место приложения, или валится по ошибке.
3) Когда скачалась новая версия, на нее делается ссылка в /tmp/uploaded и приложение гасится
4) приложение перезапускается
В результате, даже если залилось приложение с ошибками, то у меня всегда есть старая версия.