C # Mono программа падает на Raspberry Pi при автозапуске - PullRequest
0 голосов
/ 24 сентября 2018

У нас есть программа C # mono, которая работает на Raspberry Pi 3. Программа выполняется полностью, когда я запускаю ее вручную, т.е. sudo mono / pathtoexe, но когда она выполняется при перезапуске из rc.local (rc.local запускаетфайл сценария, файл sudo / pathto .sh, который, в свою очередь, запускает приложение через sudo mono / paththexe), программа выполняется только частично без видимой ошибки в журналах.

Отметьте, что тестовый случай мыпопытка преодолеть - заставить наше приложение работать без интернета, поскольку оно отлично работает, если есть интернет (как при ручном, так и при автоматическом запуске)

PI - это Raspberry PI 3 с Raspbian Version 8 (Jessie) MonoВерсия JIT-компилятора 3.2.8 (Debian 3.2.8 + dfsg-10)

Вот файл rc.local:

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
fi
#echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
#hwclock -s
#sudo /etc/init.d/watchdog start&
sudo /home/pi/Vbox/./Main.sh&
#sudo /home/pi/Vbox/./Cmu.sh&
#/usr/bin/mono-service -p:/home/pi/Vbox /home/pi/Vbox/VboxV2.exe
sudo iwconfig wlan0 txpower off
#sudo mono  /home/pi/Vbox/Vbox.exe
#sudo python /home/pi/Audio/audio_play.py
#iptables-restore < /etc/iptables.ipv4.nat
exit 0

Основная строка, которую следует отметить, это sudo / home /pi / Vbox /./ Main.sh &

Файл Main.sh:

#!/bin/bash

Date=`date +%d_%m_%Y`
ErrorLogPath="/home/pi/LOG/GatewayWrapperError_$Date.log"
LogPath="/home/pi/LOG/GatewayWrapperLog_$Date.log"

## Fail over Block
function Failover
{
    ErrorIn=$1
    Datetime=`date +%d-%m-%Y:%H-%M-%S`
    echo "Error: $1 Program"
    printf "$Datetime: Error executing $ErrorIn program. Sending E-Mail notification \n">>$ErrorLogPath
    echo "Error: notification"
    #sudo mono --runtime=v4.0 /home/pi/EXE/Email.exe &
    #wait
    printf "$Datetime: Gateway notification sent \n">>$ErrorLogPath
    #sudo wvdial 3gconnect &
    #sleep 30
    echo "wvdial run succed"
    #sudo reboot
}

function main
{
        ## Executing Net_Connection_Program  Core
#        {(
 #               ExecutionDateTime=`date +%d-%m-%Y:%H-%M-%S`
  #              printf "$ExecutionDateTime: Net_Connect.sh started. \n">>$LogPath
   #             echo "Net_Connect Started"
    #            sudo /home/pi/Wrapper/./NetConnect.sh &
     #           #sudo /home/pi/Wrapper/./test.sh &
      #  )} ||
       # {(
        #        Failover "Net_Connect_Core"
         #)}


echo "Started"

    ## Executing Gateway Core
    {( 
        ExecutionDateTime=`date +%d-%m-%Y:%H-%M-%S`
        printf "$ExecutionDateTime: ES900G started. \n">>$LogPath
        echo "ES900G Started"
        sudo mono --runtime=v4.0 /home/pi/Vbox/VboxV2.exe  &> /home/pi/LOG/GatewayWrapperLog_24_09_2018.log
    )} ||
    {( 
        Failover "Gateway_Core"
         )}



}

##Master Call
main;

Когда программа выполняется через скрипт, журналы на этом останавливаются:

Function: Main Started
73574f
Vbox Version 1.0.0.0
ERROR: ConnectMQTT - Exception connecting to the broker

ВотОсновная функция в коде:

static void Main()
        {
            try
            {
                Thread.Sleep(5000);
                Helper.WriteLine("Function: Main Started");

                const string path = "/home/pi/Vbox/vboxid.txt";
                VboxId = File.ReadAllText(path);
                Console.WriteLine(VboxId);
                Version = $"{Assembly.GetExecutingAssembly().GetName().Version}";
                Helper.WriteLine($"Vbox Version {Version}");
                CommMqttClient = null;

                if (string.IsNullOrEmpty(VboxId)) return;

                MQTT.ConnectMqtt(); //This is last error printed in the log shown above. The program seems to crash after this

                Task.Factory.StartNew(VideoStorage.StartStorage);

                Audio = new AudioPublicAnnouncement();
                LiveStreaming = new VideoStreaming();
                VideoRetrieve = new VideoRetrieve();

                Console.ReadLine();

            }
            catch (Exception e)
            {
                Helper.WriteLine("Error - Main: " + e.Message, ConsoleColor.Red);
            }
        }

В приведенном выше коде, если программа выполняется вручную, она работает.Это основная проблема, с которой я сталкиваюсь ..

Обратите внимание, что это было написано предыдущим разработчиком кода, и меня привели, чтобы решить эту проблему.В настоящее время он недоступен, и я пытался решить эту проблему последние 3 дня.Любая помощь будет принята с благодарностью.

Спасибо, Varun

EDIT: последний код с бесконечным циклом, который не останавливает выполнение:

 static void Main()
        {
            try
            {
                Thread.Sleep(5000);
                Helper.WriteLine("Function: Main Started");

                const string path = "/home/pi/Vbox/vboxid.txt";
                VboxId = File.ReadAllText(path);
                Console.WriteLine(VboxId);
                Version = $"{Assembly.GetExecutingAssembly().GetName().Version}";
                Helper.WriteLine($"Vbox Version {Version}");
                CommMqttClient = null;

                if (string.IsNullOrEmpty(VboxId)) return;   

                MQTT.ConnectMqtt();

                Task.Factory.StartNew(delegate
                {
                    MQTT.PublishMessage("REBOOT", $"VBOXID:{VboxId};VERSION:{Version};TIME:{DateTime.Now:dd-MM-yyyy HH-mm-ss};", false);
                });

                Task.Factory.StartNew(VideoStorage.StartStorage);

                Audio = new AudioPublicAnnouncement();
                LiveStreaming = new VideoStreaming();
                VideoRetrieve = new VideoRetrieve();

                while (true)
                {
                    Thread.Sleep(1000);
                }
            }
            catch (Exception e)
            {
                Helper.WriteLine("Error - Main: " + e.Message, ConsoleColor.Red);
            }
        }

1 Ответ

0 голосов
/ 15 октября 2018

Я отмечаю эту проблему как решенную.К сожалению, это связано с тем, как выполнялся код.Подробности в последнем редактировании вопроса.@knocte Да, мы должны сделать это как можно скорее, хотя, поскольку это производственная система, работающая на более чем 500 сайтах, мы должны принять расчетливый и спланированный подход к ней.Спасибо за ваш вклад.Очень признателен.Ура!

...