我为 transmission 编写了一个关闭脚本。Torrent 下载完成后,Transmission 会调用该脚本。该脚本在我的计算机上 (Ubuntu 11.04 和 12.04) 运行正常。
#!/bin/bash
sleep 300s
# default display on current host
DISPLAY=:0.0
# find out if monitor is on. Default timeout can be configured from screensaver/Power configuration.
STATUS=`xset -display $DISPLAY -q | grep 'Monitor'`
echo $STATUS
if [ "$STATUS" == " Monitor is On" ]
### Then check if its still downloading a torrent. Couldn't figure out how.(May be) by monitoring network downstream activity?
then
notify-send "Downloads Complete" "Exiting transmisssion now"
pkill transmission
else
notify-send "Downloads Complete" "Shutting Down Computer"
dbus-send --session --type=method_call --print-reply --dest=org.gnome.SessionManager /org/gnome/SessionManager org.gnome.SessionManager.RequestShutdown
fi
exit 0
问题是,当我下载多个文件时,第一个文件完成后,Transmission 会执行脚本。我想这样做,但所有下载完成后。
如果它仍在下载另一个种子,我想进行第二次检查(在监视器检查之后)。
有什么办法可以做到这一点?
答案1
此信息不会通过环境变量传递给脚本,因此您需要查询 Transmission 的 RPC 接口。这有时由客户端库完成 - 例如,Python 脚本可以使用发表于 2018-07-27 16:56:27。还有其他类似的接口列在http://www.transmissionbt.com/resources/。
这是一个快速方法,它将使用 transmission-remote 来计算非空闲下载的数量:
transmission-remote yourhost:yourport -tall --info | grep "^ State:" | grep "Down" | wc --lines
如果您还想包含空闲下载,您可以尝试以下操作:
transmission-remote yourhost:yourport -l | grep -v -e " 100% " -e "^Sum" -e "^ID" -e " Stopped " | wc --lines
其中“^ID”和“^Sum”删除页眉和页脚;“ 100% ”删除已完成的种子;“ Stopped ”删除未完成但已暂停的种子。这种方法并非万无一失——例如,名为“ 100% Stopped ”的种子会破坏它。
答案2
我创建了一个更好的脚本(来自 user98677 的建议),它利用了传输的 RPC 接口。
代码:
它能做什么?
种子完成后可暂停或删除。
发送推送通知(使用 curl)[可选]
发送 Twitter 通知(需要 twidge)[可选]
暂停/关闭计算机或者保持原样。
截屏
设置
在 Ubuntu 上
sudo apt-get install libnotify-bin
sudo apt-get install transmission-cli
在 Ubuntu >= 13.04 上(用于 Twitter 通知):
sudo add-apt-repository ppa:moorhen-core/moorhen-apps
sudo apt-get install twidge
对于suspend
非 Ubuntu 发行版(Ubuntu 使用 Upower),请安装 powermanagement-interface 包
sudo apt-get install powermanagement-interface
安装后:
获取代码github-gist并将文件保存为
trsm
硬盘上的任何位置。使文件可执行chmod a+x trsm
。登录 pushover 并复制您的用户密钥. 将其粘贴到
user-key
脚本中。如果您希望使用美观的应用程序(传输)图标发送通知,只需在 pushover 中创建一个带有传输图标的虚假应用程序,然后复制应用程序密钥(API / 令牌密钥)并将其粘贴到
app-key
脚本中。有关 Twitter 设置,请参阅 twidge 文档。
打开 transmission。转到 preference->web。启用 web 客户端(默认端口)并启用用户身份验证。选择用户名和密码。将该用户名和密码分别作为&
9091
放入脚本中。username
password
点击打开web客户端,检查是否正常运行。
最后保存脚本并转到下载选项卡(在传输首选项中)并单击
call script when torrent is complete
。选择相应的脚本。
脚本
#!/bin/bash
user-key=" " #put your pushover user-key
app-key=" " #put your pushover application-key
device=" " #Your device name in pushover
username=" " # Transmission remote username
password=" " # Transmission remote password
sleep 100s
# default display on current host
DISPLAY=:0.0
# authorize transmission
trsm="transmission-remote --auth $username:$password"
# find out number of torrent
TORRENTLIST=`$trsm --list | sed -e '1d;$d;s/^ *//' | cut --only-delimited --delimiter=' ' --fields=1`
for TORRENTID in $TORRENTLIST
do
echo "* * * * * Operations on torrent ID $TORRENTID starting. * * * * *"
#echo $TORRENTID
DL_COMPLETED=`$trsm --torrent $TORRENTID --info | grep "Percent Done: 100%"`
#echo $DL_COMPLETED
# pause completed torrents & get those torrent names.
if [ "$DL_COMPLETED" != "" ]; then
$trsm --torrent $TORRENTID --stop
trname=`$trsm --torrent $TORRENTID --info | grep "Name:" | awk -F: '{print $NF}'`
# post an update to twitter
echo "$trname download was completed" | twidge update # Put "#" if you don't need this.
# push update for pushover
curl -s \
-F "token=$user-key" \
-F "user=$app-key" \
# -F "device=$device" \ # uncomment, if you want to send notification to a particular device.
-F "title=Download Finished" \
-F "message=$trname download has completed." \
http://api.pushover.net/1/messages > /dev/null
# The following codes works assuming One take advantage of gnome-power-manager by setting "black screen after 2/5/10/.. minitues ".
# if monitor(Including laptop screen but EXCLUDING external monitor) is on, it will just force blank the screen, if not, it will shutdown/suspend or leave it as it is.
# Modify it as per your requirement.
STATUS=`xset -display $DISPLAY -q | grep 'Monitor'`
#echo $STATUS
if [ "$STATUS" == " Monitor is On" ]
then
notify-send "Downloads Complete" "turning off the screen now"
xset dpms force off
else
notify-send "Downloads Complete" "$trname"
# uncomment to shutdown the computer
#dbus-send --session --type=method_call --print-reply --dest=org.gnome.SessionManager /org/gnome/SessionManager org.gnome.SessionManager.RequestShutdown
# uncomment to suspend (on ubuntu)
#dbus-send --system --print-reply --dest="org.freedesktop.UPower" /org/freedesktop/UPower org.freedesktop.UPower.Suspend
# uncomment to suspend (on Linux) (requires powermanagement-interface package)
#pmi action suspend
else
echo "Torrent #$TORRENTID is not completed. Ignoring."
fi
done
答案3
一个简单的脚本。
感谢 Khurshid Alam 和 user98677 我编写了这个脚本,它运行良好。如果显示器打开(您正在工作),它会使 Transmission 退出并发送通知,如果没有,计算机将关闭。
安装
sudo apt-get install transmission-cli libnotify-bin
在 Ubuntu 16.04 中
sudo apt install transmission-cli libnotify-bin
- 传输>首选项>远程>检查允许远程访问,确保 HTTP 端口为 9091,并且仅允许这些 IP 地址为 127.0.0.1(默认)。
- 复制粘贴给定的脚本,保存为“shutdown.sh”并使其可执行。
- 传输>首选项>下载>选中“下载完成后调用脚本”,浏览到脚本。
系统设置>电源>屏幕亮度>不活动时关闭屏幕>选择合理的时间。
#!/bin/bash sleep 300s DISPLAY=:0.0 STATUS=$(xset -display $DISPLAY -q | grep 'Monitor') STATE=$(transmission-remote 127.0.0.1:9091 -tall --info | grep "^ State:" | grep "Down" | wc --lines) if [ "$STATUS" == " Monitor is On" ] && [ "$STATE" == "0" ] then notify-send "Downloads Complete" "Exiting transmisssion now" pkill transmission elif [ "$STATE" == "0" ] then #in Ubuntu 16,04 shutdown -h now #in older versions use the following #dbus-send --session --type=method_call --print-reply --dest=org.gnome.SessionManager /org/gnome/SessionManager org.gnome.SessionManager.RequestShutdown fi exit 0