Я пытаюсь запустить скрипт bash с кнопки веб-сайта на Raspberry Pi, где скрипт находится в home/pi/. Фрагмент кода ниже показывает мое текущее решение. Всякий раз, когда нажимается кнопка веб-сайта, она вызывает этот блок кода в файле c.
else if (strcmp(argv[1],"SelfTest") == 0)
{
char *command = "/bin/bash";
char name[40];
strcpy(name, "home/pi/SelfTest.sh");
execl(command, command, name, NULL);
return 0;
}
Я запускаю это на Raspberry Pi 3+, сценарий, который я запускаю, имеет разрешения 777 и принадлежит pi: www-data, если это поможет.
Я проверил, действительно ли был вызван блок IF, просто создав пустой каталог с именем «TEST». Нижний фрагмент кода показывает, как я к этому подошел. Кажется, это работает без проблем (как только я нажимаю кнопку на веб-сайте, я «ls» home/pi/ и появляется новая папка с именем «TEST»). К сожалению, когда я запускаю верхний фрагмент кода (для запуска SelfTest.sh), скрипт не запускается (сам скрипт должен записывать вывод в файл журнала с отметкой времени, и нажатие кнопки не обновляет отметка времени. Отметка времени обновляется только тогда, когда я запускаю скрипт из терминала)
else if (strcmp(argv[1],"SelfTest") == 0)
{
char *command = "/bin/mkdir";
char name[40];
strcpy(name, "/home/pi/TEST");
execl(command, command, name, NULL);
return 0;
}
Что должно происходить каждый раз, когда я нажимаю кнопку веб-сайта, так это запуск SelfTest.sh. Я должен быть в состоянии проверить это, прочитав файл журнала, но он никогда не обновляется, когда я нажимаю кнопку веб-сайта.
Пожалуйста, дайте мне знать, если вам нужна дополнительная информация!
Почему вообще есть strcpy
? Вы можете использовать char const* name = "/home/pi/SelfTest.sh";
.
Если вы не запускаете это из /
, в этой строке отсутствует косая черта перед home
:
strcpy(name, "home/pi/SelfTest.sh");
Кроме того, execl
никогда не вернется. Возможно, вы захотите найти информацию о шаблонах fork()
и exec()
.
Незначительное исправление: execl
может вернуться, если есть ошибка при выполнении файла (как в оригинальной версии).
Видимо я очень неуклюжий и не понял, что мне не нужен bash. Я изменил 'char *command = "/bin/bash";' на 'char *command = "/bin/sh";' и сценарий работал, как и ожидалось!
Попробуйте перенаправить stdout и stderr в файл и посмотреть, генерируется ли какое-либо сообщение об ошибке.