2013-08-27 53 views
9

On (distro Angstrom trên BeagleBone Black) Linux của tôi, tôi có một dongle USB trong đó trình bày như một cổng nối tiếp và mỗi mặc định có sẵn như là /dev/ttyUSB0Linux: Bắt đầu daemon trên kết nối USB-sê-ri dongle

Tôi muốn bắt đầu một daemon, mà sẽ kết nối với cổng nối tiếp và làm cho nó có sẵn như là một ổ cắm. Tôi có mã cho cầu nối USB-to-socket này và nó hoạt động khi bắt đầu bằng tay.

Tôi muốn nó tự khởi động bất cứ khi nào hệ thống khởi động, giả sử khóa USB được cắm vào. Tôi nên làm như thế nào?

Những nỗ lực cho đến nay:

  1. systemd: Tôi tạo ra một dịch vụ systemd với điều kiện After: remote-fs.targetAfter:syslog.target, nhưng (có vẻ như) USB dongle chưa sẵn sàng tại thời điểm đó và khởi động của daemon thất bại.

    Có hệ thống khác targets hoặc services để điều kiện, sao cho daemon chỉ được bắt đầu khi udev đã hoàn tất việc cài đặt thiết bị và mạng đã sẵn sàng?

  2. udev: Tôi tạo ra một quy tắc udev như

    KERNEL == "ttyUSB?", RUN + = "/ path/to/daemon.sh"

    mà thực hiện thành công. Nhưng daemon (được bắt đầu như là một quá trình nền với một "&" trong kịch bản đó) dường như không thực thi. Ngoài ra nó có vẻ được cau mày, để ngã ba quá trình chạy dài từ các quy tắc udev.

cách chính xác để làm điều đó là gì?

+0

Tôi đã có một vấn đề tương tự trong một thời gian trước đây, bài viết blog này giúp tôi rất nhiều (vì nó gần như chính xác những gì bạn đang cố gắng để làm). [Cách (đúng) để bắt đầu dịch vụ systemd chạy dài trên sự kiện udev (hotplug thiết bị)] (http://blog.fraggod.net/2012/06/16/proper-ish-way-to-start -long-running-systemd-service-on-udev-event-device-hotplug.html) –

+0

Cảm ơn bạn đã tham khảo, nó bây giờ hoạt động! – Philipp

Trả lời

9

Tạo một quy tắc udev như

# cat /etc/udev/rules.d/95-serialdaemon.rules 
KERNEL=="ttyUSB0", ENV{SYSTEMD_WANTS}="serialdaemon.service" 

Tạo một dịch vụ systemd như

# cat /lib/systemd/system/serialdaemon.service 
[Unit] 
Description=USB serial to socket bridge 
After=remote-fs.target 
After=syslog.target 

[Service] 
ExecStart=/mnt/serialdaemon.sh 

Tạo file thực thi

# cat /mnt/serialdaemon.sh 
#!/bin/sh 
date +%F-%T >> /var/log/serialdaemon.log 
/usr/local/serialdaemon/serialdaemon -serial /dev/ttyUSB0 -port 15789 -baud 38400 >> /var/log/serialdaemon.log 2>&1 
date +%F-%T >> /var/log/serialdaemon.log 
+1

Bạn chỉ có thể đánh dấu anwser của riêng mình là "được chấp nhận", vì đó là giải pháp phù hợp cho vấn đề của bạn. Không có gì sai về nó ... –

3

Kể từ khi liên kết trong bình luận gì thêm tôi dường như để giải quyết vấn đề này, đây là giải pháp cho việc sử dụng udev để bắt đầu một daemon khi một ce thiết bị usb rtain được cắm vào:

Proper(-ish) way to start long-running systemd service on udev event (device hotplug)

+2

Chấp nhận câu trả lời của bạn để bạn có được điểm. Của tôi chỉ có cho (của riêng tôi) tham khảo. – Philipp

+0

Liên kết này cung cấp giải pháp khả thi, nhưng trong trường hợp liên kết này bị hỏng trong tương lai, vui lòng sao chép-dán nội dung của liên kết đó trong câu trả lời của bạn.Tất nhiên, bạn sẽ cần phải cung cấp tín dụng do bằng cách đề cập đến liên kết ban đầu. – anishsane

+0

@anishsane Xin lỗi vì điều đó, bạn đã đúng. Đây là một trong những bài viết đầu tiên của tôi về SO, nếu tôi đã viết câu trả lời hôm nay, tôi đã làm điều đó. Tôi sẽ thêm một bản tóm tắt các giải pháp được cung cấp trong liên kết nếu tôi có một số thời gian rảnh rỗi. –