I am using the following code to move files from one folder to another on the remote server:
ssh username@server <<EOF
cd source_dir
find . -type f -name "*.txt" |xargs -n1000 -i{} mv {} dest_dir
if [$? !=0]
then send mail indicating error
otherwise
echo "success"
fi
EOF
Now,when i do the manual run of the script it works fine but when schedule run of the script takes place it send the mail to me indicating that some error has occured(though dont' know the exact error).
Could someone tell me why is this happening.Moreover, how can i track down the exact error message while the schedule run of the script is taking place.
If you are running this from cron, any error message should arrive by email (unless you explicitly redirect standard error someplace). On the other hand, perhaps it would in fact make sense to capture standard output and standard error to a temporary file somewhere so you can inspect them in more or less real time.
Perhaps a good start would be to include the value of $? in the error report. If you capture standard error and standard output from the pipeline to a temporary file, include that in the email, too.
Note that the exit code from xargs might mask the exit code from mv
As a stylistic issue, the only command which really needs to run on the remote server is the find | xargs mv pipeline.
$filename is present on my local server , will the above code be able to trace the messages. Else please suggest the other variant of the code to track the exact error message.The log file should be present on the local server.
Pretty close, you want 2>&1 instead of 2>>$filename I guess. You probably want to send $filename with the mail message, and remove $filename after you're done.
Is it possible to send the error description(system-defined) corresponding to the exitstatus. Please let me know.
Is there any difference if i use -n100 instead of -n 100 in the xargs command? Is that space important as i have tested my script without using the space.
What do you mean by "error description(system-defined) corresponding to the exitstatus"?
The space between -n and the number is probably insignificant. There are various option-processing libraries and some are sensitive to these differences while others are not, so use whatever works for you.
I mean if the exit status is 1 then how can we get the actual error message which the shell might have returned while running the command. (or do i have to use the user-defined message only)
I still don't understand the question. What's "the user-defined message"? If you mean "will the email contain everything that I would have seen when running this at the prompt" then the answer is hopefully yes already. The shell as such does not tell you anything about errors from commands you run. Any error message from the ssh pipeline should already be in $filename.
when i run the script using ./ the script doesn't give any problem but when i schedule it using cron then while executing the ssh command it gives the following error:
ssh: not found.
Please suggest how can i modify my script to avoid this error.
The username which i am using to schedule to script and the username which i am using while doign ssh is different