Как мне завершить созданный сценарий оболочки?

#gnome-shell #gnome-shell-extensions

Вопрос:

Я пишу свое первое расширение gnome shell для обновления фона рабочего стола до Microsoft Daily Wallpaper, создав и запустив сценарий оболочки. Вот сценарий оболочки, он повторяется каждые 15 минут

 while :
do
result=$(curl -s -X GET --header "Accept: */*" "http://www.bing.com/HPImageArchive.aspx?format=jsamp;idx=0amp;n=1amp;mkt=en-US")
regex="th. .jpg"
if [[ $result =~ $regex ]]
then
    gsettings set org.gnome.desktop.background picture-uri "http://bing.com/${BASH_REMATCH[0]}"
fi
sleep 900
done
 

Вот extension.js файл, я создал его, чтобы создать сценарий оболочки выше, а затем запустить его

 const Util = imports.misc.util;

const loc = "~/.local/share/gnome-shell/extensions/bingwall@anb1142.io/bing_wallpaper.sh";
function init() {
    const command = `printf 'while :ndonresult=$(curl -s -X GET --header "Accept: */*" "http://www.bing.com/HPImageArchive.aspx?format=jsamp;idx=0amp;n=1amp;mkt=en-US")nregex="th. .jpg"nif [[ $result =~ $regex ]]nthenn    gsettings set org.gnome.desktop.background picture-uri "http://bing.com/${BASH_REMATCH[0]}"nfinsleep 900ndonen' > ${loc}`;
    Util.spawn(["/bin/bash", "-c", command]);
    Util.spawn(["/bin/bash", "-c", `chmod  rwx ${loc}`]);
}
function enable() {
    Util.spawn(["/bin/bash", "-c", loc]);
}

function disable() {
    // stop that script
}
 

Вот проблема. Я знаю, как его запустить, но я не знаю, как разорвать этот цикл или уничтожить скрипт. Я хочу, чтобы это происходило при отключении. Как мне это сделать? Заранее спасибо

Ответ №1:

Во-первых, стоит отметить, что вы не должны делать ничего из этого в сценарии оболочки. Комбинация libsoup и GSettings позволит вам делать то, что вы хотите, не блокируя основной поток GNOME Shell или не создавая сценарий оболочки.

Существует учебное пособие по gjs.guide, в котором описывается, как создавать и управлять подпроцессами в GJS. В принципе, процессы могут быть запущены Gio.Subprocess.new() и остановлены вызовом force_exit() возвращаемого объекта:

 const {Gio} = import.gi;

try {
    // If no error is thrown, the process started successfully and
    // is now running in the background
    let proc = Gio.Subprocess.new(['ls'], Gio.SubprocessFlags.NONE);

    // At any time call force_exit() to stop the process
    proc.force_exit();
} catch (e) {
    logError(e, 'Error executing process');
}