2016-01-27 51 views
0

引起我是一個Linux Mint的用戶,我想寫一個規則,當我插上USB是執行一個腳本不能正常工作。該#!/bin/sh script,不成功 訪問USB(即使是普通的CD),而如果我運行命令行相同 腳本,它完美的作品。腳本時,使用udev規則

我爲此目的而設立的規則是:

ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="058f", ATTR{idProduct}=="6387", RUN+=="/home/dario/bin/backup_usb" 

其中例如backup_usb樣子:

#!/bin/sh 
sleep 10 
cd /media/dario/ 
echo " I am now in: $(pwd)" >> /home/dario/bin/log.log 
cd /media/dario/DARIO_USB/ # That's the device just plugged in. 
echo " I am now in: $(pwd)" >> /home/dario/bin/log.log 

輸出是:

I am now in: /media/dario/ 
and now in:/

,而我期待:

I am now in: /media/dario/ 
and now in: /media/dario/DARIO_USB/ 

我將是任何幫助,非常感謝。

(這是我的問題的編輯版)

+0

「不工作」對我們來說是不夠的。至少設置日誌記錄。此外,所有'= 3D'的東西都被破壞了 - 每個'= 3D'應該是一個單一的'='符號,'= 20'同樣也是一個空格的轉義碼。 –

+0

此外,你正在標記你的問題bash,但使用'#!/ bin/sh'作爲POSIX sh。它只能是一個或另一個;這是什麼? –

+0

我想我不知道它是怎麼叫的。我正在使用#!/ bin/sh。是標記:shell正確的標記? – dario

回答

1

首先,你的規則是錯誤的。考慮類似於:

ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="058f", 
ATTR{idProduct}=="6387", RUN+="/home/dario/bin/backup_usb" 

第二:殺死sleep 10。如果udev按順序運行腳本並在運行下一個腳本之前等待每個腳本完成,它可能會阻止任何後續腳本(例如正在執行掛載的腳本),從而阻止它發生。我們將以不同的方式執行此操作,將投票置於後臺:

#!/bin/bash 
#  ^^^^ - has to be bash, as the C-style for loop syntax used below is a bashism 
#    ...as is the [[ ]] construct. 

exec </dev/null >/home/dario/usb.log 2>&1 
set -x 
cd /media/dario || exit 
(
    for ((retries=0; retries<10; retries++)); do 
    [[ -d DARIO_USB ]] && grep -q -e DARIO_USB /proc/mounts && continue 
    sleep 1 # retry 
    done 
    cd DARIO_USB || exit 
    echo "SUCCESS" 
) & 
+0

感謝您的回答。我編輯我的問題。我會有一個問題:exec 2>/path/to/logfile;設置-x;做?當從終端 – dario

+0

'exec 2>/path/to/logfile'調用相同的腳本將stderr從您的腳本重定向到一個名爲'/ path/to/logfile'的文件時,我所要求做的操作是微不足道且完美的工作。 'set -x'記錄腳本運行的每個命令。 –

+0

當你從一個終端運行時,你的環境會有很大的不同。也許你依賴於交互式shell中存在的'PATH'元素,但不依賴於由udev調用的shell - 無論原因是什麼,日誌都應該清楚。 –