[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Multithreading with libssh
[Thread Prev] | [Thread Next]
- Subject: Re: Multithreading with libssh
- From: Nick Burrett <nick@xxxxxxxxxx>
- Reply-to: libssh@xxxxxxxxxx
- Date: Fri, 27 Sep 2019 14:29:16 +0100
- To: libssh@xxxxxxxxxx
The problem with your approach is that you have to error-check all 1500
commands that you execute, handle the issues and handle the session itself
terminating mid-run. Better would be to have a local command on host that
wraps the 1500 commands that you want to run.
I would suggest this approach instead:
ssh to host
system-run wrappercmd.sh
wait for command to complete with systemctl status
extract output with journalctl --unit=... or have the wrapper write the
output to a file that you can then retrieve using SFTP or cat.
If you expect the commands to take minutes to complete, then re-connect to
the host each time you want to poll for completion.
On Thu, 26 Sep 2019 at 12:09, Simon Moselewski <s.moselewski@xxxxxxxx>
wrote:
> Hi everyone,
>
> I am using libssh to connect to a remote host, run commands on it and read
> the results. Since I am doing this for 1500 commands I want to use threads
> to parallelize that.
>
> I am using gcc compiler with flags -libssh -pthread and -lssh_threads.
>
> My threadless approach was:
> open session
> repeat 1500 times {
> open channel
> run remote command
> close channel
> }
> close session
>
> I read in the docu, that sessions cannot be shared over multiple threads,
> so with the threadful approach I do it differently:
> repeat 1500 times {
> open session
> open channel
> run remote command
> close channel
> close session
> }
>
> The threadful programm takes longer than my threadless approach so I guess
> something with the threading is not working correctly.
>
> I am very inexperienced with threads and would need some help here.
>
> Thanks in advance for any hints!!!
> Regards
> Simon
>
>
>
> My threadful code (shortened):
>
> ssh_threads_set_callbacks(ssh_threads_get_pthread());
> ssh_init();
> std::mutex mutex;
> std::vector<std::future<void>> tasks;
> tasks.reserve(16);
> for (list<Metric>::iterator it = metrics.begin(); it != metrics.end();
> it++) {
> Metric metric = *it;
> tasks.emplace_back(std::async(std::launch::async, [&ip, &user, &pw,
> metric, i, &mutex]() {
> std::lock_guard<std::mutex> lock(mutex);
> try {
> ssh_session session = ssh_new();
> ssh_options_set(session, SSH_OPTIONS_HOST, IP);
> rc = ssh_userauth_password(session, USERNAME, PASSWORD);
> ssh_channel channel = ssh_channel_new(session);
> rc = ssh_channel_open_session(channel);
> rc = ssh_channel_request_exec(channel, COMMAND);
> // get output
> char buffer[32] = {0};
> int nbytes;
> nbytes = ssh_channel_read(channel, buffer, sizeof(buffer)-1,
> 0);
> ssh_channel_send_eof(channel);
> //get exit code
> int exitCode = -1;
> exitCode = ssh_channel_get_exit_status(channel);
> ssh_channel_close(channel);
> ssh_channel_free(channel);
> ssh_disconnect(session);
> ssh_free(session);
> }
> catch(...) {
> //something
> }
> }));
> }
> std::for_each(std::begin(tasks), std::end(tasks), [](auto& task) {
> task.get();
> });
> std::cout << "Done.\n";
> ssh_finalize();
>
| Multithreading with libssh | Simon Moselewski <s.moselewski@xxxxxxxx> |