Я пытаюсь запустить скрипт 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». Нижний фрагмент кода показывает, как я подошел к этому. Кажется, это работает без проблем (как только я нажимаю кнопку на веб-сайте, я вижу «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. Я должен быть в состоянии проверить это, прочитав файл журнала, но он никогда не обновляется, когда я нажимаю кнопку веб-сайта.
Пожалуйста, дайте мне знать, если вам понадобится дополнительная информация!
2 ответа
Видимо, я очень неуклюжий и не понимал, что мне не нужен удар. Я изменил 'char * command = "/ bin / bash";' to 'char * command = "/ bin / sh";' и скрипт запускался как положено!
Если только вы не запускаете это из /
, в этой строке отсутствует косая черта перед home
:
strcpy(name, "home/pi/SelfTest.sh");
Кроме того, execl
никогда не вернется. Вы можете посмотреть информацию о шаблонах fork()
и exec()
.
Новые вопросы
c
C - это язык программирования общего назначения, используемый для системного программирования (ОС и встраиваемых), библиотек, игр и кроссплатформенности. Этот тег следует использовать с общими вопросами, касающимися языка C, как это определено в стандарте ISO 9899 (последняя версия 9899: 2018, если не указано иное, а также для запросов, специфичных для версии, с c89, c99, c11 и т. Д.). C отличается от C ++ и не должен сочетаться с тэгом C ++ без разумной причины.