2009-08-03 33 views
24

Tôi chỉ chuyển từ phát triển .net vào sự phát triển LINUX MONO ... và tôi don có nhiều kinh nghiệm với Linux dev trước ..Windows như phát triển dịch vụ trong LINUX bằng MONO?

  1. Tôi có một yêu cầu để tạo ra một dịch vụ nền (như dịch vụ cửa sổ) trong mono C# .. là nó có thể ..

  2. Và có thể truy cập các API gốc LINUX từ mono C# hay không. (như các cuộc gọi winAPI từ win C#) ..

Trả lời

17
  1. Mono tàu có hệ điều hành Windows Dịch vụ tương thích được gọi là dịch vụ đơn.

    • Từ Unix cho dịch vụ là Daemon. Các daemon thông thường có thể được tìm thấy trong /etc/init.d/ và được cài đặt vào runlevel mà chúng được cho là chạy trong symlinked từ thư mục /etc/rc.*.
  2. Chỉ cần sử dụng p/gọi như bình thường. Bạn cũng có thể kiểm tra mã nguồn của một số dự án đơn giản khác dựa trên đơn giản như Banshee để xem cách chúng thực hiện p/invokes trên Linux. Chỉ cần tìm kiếm banshee trên google.com/codesearch.

+0

cảm ơn eddie cho câu trả lời của bạn .. okie Tôi sẽ thử một số mẫu .. – RameshVel

+0

Liên kết đã lỗi thời, vui lòng cập nhật: Ь –

4

Đối với 1. - có thể tạo dịch vụ nền trong mono C#. Dịch vụ là trong thực tế, một chương trình chạy trong nền không có đầu vào từ bàn phím và chuột, và không đầu ra trực tiếp vào màn hình của người dùng. Sau khi bạn tạo chương trình như vậy, bạn chỉ có thể chạy chương trình với nohup ./programname & để đặt nó hoạt động ở chế độ nền và bỏ qua tín hiệu gác máy (được gửi đến các quy trình đang chạy của bạn khi bạn đăng xuất).

Nếu bạn muốn tích hợp nó tốt hơn, bạn phải viết một số tập lệnh bổ sung để dừng, bắt đầu, khởi động lại, v.v. (tùy thuộc vào bản phân phối Linux bạn đã chọn).

+0

cảm ơn Senad Uka, u có nghĩa là, nó sẽ là bất kỳ ứng dụng giao diện điều khiển không cửa sổ bình thường, và sẽ được đặt để chạy trong nền bằng cách sử dụng các lệnh LINUX .. – RameshVel

2

Đối với LINUX (Unix api), bạn có thể sử dụng Mono.UNIX library được bao gồm trong đơn. Mặc dù là một quy tắc chung, bạn nên cố gắng gắn bó với các giải pháp di động thay vì các công cụ như Mono.UNix hoặc p/gọi bất cứ khi nào có thể.

23

Tôi sử dụng tập lệnh, vì vậy tôi có thể nắm bắt mã thoát và sử dụng nó để thực hiện cập nhật tự động và mọi thứ. Nó cũng tự khởi động lại nếu nó bị treo và gửi e-mail cho bạn khi nó khởi động lại với các dòng x cuối cùng của tệp nhật ký.

/etc/init.d/MyMonoApp

#!/bin/sh 
#/etc/init.d/MyMonoApp 
# 

APP_NAME="MyMonoApp" 
APP_PATH="/home/mono/MyMonoApp" 

APP_USER=mono 

case "$1" in 
    start) 


     echo "Starting $APP_NAME" 

     start-stop-daemon --start \ 
          --background \ 
          --make-pidfile \ 
          --pidfile /var/run/$APP_NAME.pid \ 
          --chuid $APP_USER \ 
          --exec "$APP_PATH/$APP_NAME" 
    ;; 
    stop) 

     echo "Stopping $APP_NAME" 
       start-stop-daemon -o --stop \ 
       --pidfile /var/run/$APP_NAME.pid 

    ;; 
    *) 
    echo "Usage: /etc/init.d/$APP_NAME {start|stop}" 
    exit 1 
    ;; 
esac 

exit 0 

/home/mono/MyMonoApp

#!/bin/sh 
#!/home/mono/MyMonoApp 

APP_NAME=`basename $0` 
APP_DIR=`dirname $0` 
HOSTNAME=`hostname` 

cd $APP_DIR 

tail --lines=300 output.log | mail -s "MyMonoApp $HOSTNAME:$APP_NAME STARTED" "[email protected]" 

exitcode=0 
until [ $exitcode -eq 9 ] 
do 
     startdate="$(date +%s)" 
     /usr/local/bin/mono MyMonoApp.exe $HOSTNAME:$APP_NAME > output.log 
     exitcode=$? 
     enddate="$(date +%s)" 

     echo "EXIT CODE = $exitcode" >> output.log 

     cp -f output.log output.log.1 
     elapsed_seconds="$(expr $enddate - $startdate)" 
     echo "Elapsed seconds $elapsed_seconds" 


     subject="EXIT CODE: $exitcode" 
     echo "BASH: Exit Code = $exitcode" 

     if [ $exitcode -eq 6 ] #Restart 
     then 
      subject="RESTART" 
     elif [ $exitcode -eq 7 ] #Previous version 
     then 
      subject="PREVIOUS VERSION" 
      cp -fv MyMonoApp.exe_previous MyMonoApp.exe 
     elif [ $exitcode -eq 8 ] #Update 
     then 
      subject="SOFTWARE UPDATE" 
      cp -fv MyMonoApp.exe MyMonoApp.exe_previous 
      mv -fv MyMonoApp.exe_new MyMonoApp.exe 
     elif [ $exitcode -eq 9 ] #Shutdown 
     then 
      subject="SHUTDOWN" 
     fi 


     if [ $elapsed_seconds -ge 10 ] #been running for longer than 10 seconds 
     then 
       tail --lines=300 output.log | mail -s "MyMonoApp $HOSTNAME:$APP_NAME $subject" "[email protected]" 
       sleep 1 # tiny delay to let things settle 
     else 
       sleep 5 # delay to protect against eating the CPU resourses 
     fi 


done 

Lưu ý: nếu bạn đóng ứng dụng bằng cách sử dụng kịch bản init.d, nó sẽ giết chết quá trình, chứ không phải là tín hiệu để đóng sạch.

+0

Tuyệt vời, chỉ là những gì tôi cần! Cảm ơn nhiều! – VirusX

+0

@FlappySocks tập lệnh hoạt động tuyệt vời trừ khi tôi ngừng dịch vụ bằng tập lệnh init.d nó dừng tập lệnh nhưng không dừng quá trình xử lý đơn. Còn ý tưởng nào để sửa cái này nữa không? – ColmanJ

Các vấn đề liên quan