У меня проблема с libssh (libssh.org). Мне нужно запустить make-файл на удаленном сервере. Я делаю это с помощью команды «channel_request_exec»:
int SSHExecCmd (void(* MessSender)(char* CurMessage, bool IsError, CWnd* MainWnd),ssh_session session, CString & ShellEcho, char * cmd, CWnd* MainWnd)
{
ssh_channel channel;
int rc;
channel = ssh_channel_new(session);
if (channel == NULL) return SSH_ERROR;
rc = ssh_channel_open_session(channel);
if (rc != SSH_OK)
{
ssh_channel_free(channel);
return rc;
}
rc = ssh_channel_request_exec(channel, cmd);
if (rc != SSH_OK)
{
ssh_channel_close(channel);
ssh_channel_free(channel);
return rc;
}
char buffer[256];
unsigned int nbytes;
nbytes = ssh_channel_read(channel, buffer, sizeof(buffer), 0);
while (nbytes > 0)
{
if (fwrite(buffer, 1, nbytes, stdout) != nbytes)
{
ssh_channel_close(channel);
ssh_channel_free(channel);
return SSH_ERROR;
}
nbytes = ssh_channel_read(channel, buffer, sizeof(buffer), 0);
}
if (nbytes < 0)
{
ssh_channel_close(channel);
ssh_channel_free(channel);
return SSH_ERROR;
}
return SSH_OK;
}
Makefile находится в корне:
all: mpi_cuda.o pattern2d.o
mpicc mpi_cuda.o pattern2d.o -o mpi_cuda -lrt -lpthread -L/opt/cuda/lib64 -lcudart -lm
mpi_cuda.o: mpi_cuda.c
mpicc -g -std=c99 -D_GNU_SOURCE -I/opt/cuda/include -c $< -o $@
pattern2d.o: pattern2d.cu
nvcc -g -c $< -o $@
Я посылаю команду «make» и получаю эхо:
mpicc -g -std=c99 -D_GNU_SOURCE -I/opt/cuda/include -c mpi_cuda.c -o mpi_cuda.oda
но ничего не происходит (компиляция не выполняется).
Если я сделаю с замазкой: все работает. Эхо:
make
mpicc -g -std=c99 -D_GNU_SOURCE -I/opt/cuda/include -c mpi_cuda.c -o mpi_cuda.o
mpi_cuda.c: В функции ‘main’:
mpi_cuda.c:148: предупреждение: недостаточно аргументов для указанного формата
nvcc -g -c pattern2d.cu -o pattern2d.o
mpicc mpi_cuda.o pattern2d.o -o mpi_cuda -lrt -lpthread -L/opt/cuda/lib64 -lcudart -lm
Как мне это решить?
Не знаком с libssh, но ошибка может быть, потому что среда настраивается по-другому, поэтому явно может помочь запуск make через shell.
Попробуйте изменить команду (make
?) чтобы
bash -c make
Если это не работает, попробуйте
bash -c "export > env.txt ; make > make_out.txt 2> make_err.txt"
Затем проверьте, появились ли эти файлы и что они содержат, что должно дать хорошие подсказки.
Если у вас есть рабочий и нерабочий дела, получите эти файлы из обоих дел и сравните их (например, с diff -u
).
И изменить bash
к любой оболочке, которую вы используете (и в этом случае проверьте, если -c
это правый переключатель, чтобы дать командную строку, и если export
это правильная команда для отображения окружения), если вы не используете bash.
Основываясь на комментариях ниже: Разница в env.txt может быть, потому что некоторые переменные среды устанавливаются только для интерактивных оболочек. Например, в моем окне Ubuntu начало .bashrc имеет такие строки:
# If not running interactively, don't do anything
[ -z "$PS1" ] && return
Теперь, если любая из этих необходимых переменных environemnt установлена в .bashrc после этой строки, и ваше ssh-соединение не является интерактивным (без псевдо-tty), они не устанавливаются.
Если это так, переместите эти наборы переменных env в ~/.profile
или в ~/.bashrc
перед таким испытанием, как указано выше. Также сделать man bash
и прочитайте материал о файлах инициализации (вот так ~/.bashrc
).
Другое решение состоит в том, чтобы сделать ssh-сессию интерактивной, что, как мне кажется, описано на этой странице для libssh: http://api.libssh.org/master/libssh_tutor_shell.html .
Я бы предложил открыть неинтерактивную оболочку и сделать это там. Увидеть