백그ë¼ì´ë ì¤í¬ë¦½í¸
백그ë¼ì´ë ì¤í¬ë¦½í¸ë ê³ì ì¤íí´ì¼ íë ì¤í¬ë¦½í¸ì ì í©í©ëë¤. 백그ë¼ì´ë ì¤í¬ë¦½í¸ë ScriptCat ì ì© ì¤í¬ë¦½í¸ ì íì ëë¤. ìëë°ì¤ìì ì¤íëë©° DOMì ì ê·¼í ì ììµëë¤. Tampermonkeyì ëì¼í GM API를 ì¬ì©íì¬ ê°ë°í ì ìì¼ë©° í¸íì± ì°¸ê³ ì¬íì 문ìì ëª ìëì´ ììµëë¤.
백그ë¼ì´ë ì¤í¬ë¦½í¸ (@background)â
백그ë¼ì´ë ì¤í¬ë¦½í¸ë @background ìì±ì¼ë¡ ì ì¸ë©ëë¤. ì¤í¬ë¦½í¸ê° íì±íëê±°ë ë¸ë¼ì°ì ê° ììë íìë 백그ë¼ì´ëìì ê³ì ì¤íëëë¡ í©ëë¤.
ìì½ ì¤í¬ë¦½í¸ (@crontab)â
ìì½ ì¤í¬ë¦½í¸ë ìê° ì£¼ê¸°ë¡ ë°ë³µì ì¼ë¡ ì¤íí´ì¼ íë ìì ì ì í©í 백그ë¼ì´ë ì¤í¬ë¦½í¸ì í ì¢ ë¥ì ëë¤.
ìì½ ì¤í¬ë¦½í¸ë @crontab ìì±ì¼ë¡ ì ì¸ë©ëë¤. ë¶ ë¨ìì ì´ ë¨ì ìì½ì ì§ìíë©°, ëì¼í ìê° ì£¼ê¸° ë´ìì ë ë² ì´ì ì¤íëë ê²ì ë°©ì§íë ScriptCatì íì¥ êµ¬ë¬¸ once / once(...)ì ì ê³µí©ëë¤.
â ï¸ ì°¸ê³ :
- ë¨ì¼ ì¤í¬ë¦½í¸ìì 첫 ë²ì§¸
@crontabë§ ì ì©ë©ëë¤ - ì¤í¬ë¦½í¸ì ë¨ì¼ ì¤í ìê° + ì¬ìë ìê°ì´ cron ê°ê²©ì ì´ê³¼íì§ ìë ê²ì´ ì¢ìµëë¤. ê·¸ë ì§ ìì¼ë©´ ì¤íì´ ê²¹ì¹ ì ììµëë¤
Cron ííì ì°¸ê³ ì¬íâ
ScriptCatì cron 구íì íì¤ cron 구문ì ìì íì¥ì ëí node-cronì 기ë°ì¼ë¡ í©ëë¤.
ííì íìâ
íì¤ 5íë íì (ê¶ì¥)â
minute hour day month weekday
íì¥ 6íë íì (ë¹ê¶ì¥)â
second minute hour day month weekday
â ï¸ 6íë íìì ê¶ì¥ëì§ ììµëë¤ ë¸ë¼ì°ì íê²½ì ì´ ë¨ì ì ë°ë를 ë³´ì¥í ì ìì¼ë©° ì±ë¥ ì¤ë²í¤ëê° ì¦ê°í©ëë¤ â 백그ë¼ì´ë íì´ì§ì ìì½ì´ ì§ì°ë ì ììµëë¤.
íëë³ ì¬ì© ê°ë¥í 구문â
| 구문 | ì미 | ì |
|---|---|---|
* | 모ë ê° | * (매ë¶/매ìê°) |
| ì«ì | í¹ì ê° | 5 (5ë¶) |
a,b,c | ì¬ë¬ ê°ë³ ê° | 1,15,30 |
a-b | ì°ì ë²ì | 10-23 |
*/n | n ë¨ìë§ë¤ | */5 |
a-b/n | ë¨ê³ê° ìë ë²ì | 10-50/10 |
ìì¼ ê·ì¹â
1â6: ììì¼ë¶í° í ìì¼ê¹ì§0ëë7: ì¼ìì¼
once íì¥ êµ¬ë¬¸â
onceì ì미â
cron ííììì once를 ì¬ì©íë©´ ë¤ìì ì미í©ëë¤:
íì¬ ìê° ì£¼ê¸° ë´ìì í ë²ì ì±ê³µì ì¸ ì¤íë§ íì©
ê°ì 주기 ë´ì ì´í ìê° ì§ì ì´ ì¬ì í cron ê·ì¹ê³¼ ì¼ì¹íëë¼ë ì¤í¬ë¦½í¸ë ë¤ì ì¤íëì§ ììµëë¤.
once vs. once(...)â
| 구문 | ì´ íëì 기본 cron ê° | ì¤ëª |
|---|---|---|
once | * (모ë ê°) | í¹ì ìê° ìì´ ì£¼ê¸° ë´ ì²« ì¼ì¹ìì ì¤í |
once(expr) | expr | 주기 ë´ìì exprê³¼ ì¼ì¹íë ìê°ìë§, ê·¸ë¦¬ê³ í ë²ë§ ì¤í |
once(expr)ì ì¬ì©íë©´ "ì£¼ê¸°ë¹ í ë²ë§ ì¤í"ì ì ì§íë©´ì íë³´ ìê° ì§ì ì ì ííê² ì§ì í ì ììµëë¤. ê´í¸ ììë 모ë íì¤ cron 구문(ì«ì, ë²ì, ë¨ê³, 목ë¡)ì´ ì§ìë©ëë¤.
ìì ë¹êµ:
* once * * * // 매ìê° ììì ë¶; 첫 ì¼ì¹ìì ì¤í, ê·¸ ìê°ìë ë ì´ì ì¤íëì§ ìì
* once(9-17) * * * // ë§¤ì¼ 9:00~17:59 ì¬ì´, ìê°ë¹ í ë² ì¤í
0,30 once * * * // 매ìê° 0ë¶ ëë 30ë¶ ì¤ ë¨¼ì ì¼ì¹íë ê²ì´ ì¤íë¨; ê·¸ ìê°ìë ë ì´ì ì¤íëì§ ìì
onceì ìì¹ = ì ííë ìê° ì£¼ê¸°â
once / once(...)ì´ ì´ëì ë°°ì¹ëë "í´ë¹ ìê° ë¨ì ë´ìì í ë²ë§ ì¤í"ì ì미í©ëë¤.
once ìì¹ | ëì |
|---|---|
| ë¶ íë | ë¶ë¹ í ë²ë§ ì¤í |
| ìê° íë | ìê°ë¹ í ë²ë§ ì¤í |
| ì¼ íë | í루ì í ë²ë§ ì¤í |
| ì íë | í ë¬ì í ë²ë§ ì¤í |
| ìì¼ íë | ì¼ì£¼ì¼ì í ë²ë§ ì¤í |
ìì:
* once * * * // ìê°ë¹ í ë²ë§ ì¤í
* * once * * // í루ì í ë²ë§ ì¤í
* 9-18 once * * // ë§¤ì¼ 9:00~18:59 ì¬ì´ì í ë²ë§ ì¤í
onceì ë²ì / ëª©ë¡ / ë¨ê³ ê²°í©â
once / once(...)ì 모ë cron 구문과 ê²°í©í ì ìì§ë§ ê·ì¹ì íëë¿ì
ëë¤:
ê°ì 주기 ë´ìì í ë² ì¤íì ì±ê³µíë©´ ì´íì 모ë ì¼ì¹ ìê° ì§ì ì 무ìë©ëë¤
ìì 1: ë²ìâ
* 10 once * *
ì미:
- ë§¤ì¼ 10:00~10:59ê° íë³´ ìê°ì ëë¤
- í루ì 첫 ì¼ì¹ í
- 10:05~10:59ë ë ì´ì ì¤íëì§ ììµëë¤
ìì 2: 목ë¡â
* 1,3,5 once * *
ì미:
- ë§¤ì¼ 1:00, 3:00, 5:00ê° íë³´ ìê°ì ëë¤
- 1:00ì ì´ë¯¸ ì¤íë ê²½ì°
- 3:00ê³¼ 5:00ì ê±´ëëëë¤
ìì 3: ë¨ê³â
* */4 once * *
ì미:
- ë§¤ì¼ 0:00, 4:00, 8:00, 12:00, 16:00, 20:00ì´ íë³´ ìê°ì ëë¤
- í루ì 첫 ì¤í í
- ë ì´ì ìê° ì§ì ì´ ì¤íëì§ ììµëë¤
ìì 4: once(...)ì¼ë¡ íë³´ ìê° ì§ì ì§ì â
* once(9-17) * * *
ì미:
- ë§¤ì¼ 9:00~17:00ì´ íë³´ ìê°ì ëë¤
- 주기ë 매ìê° ì¬ì¤ì ë©ëë¤. í ìê° ë´ìì 첫 ì¼ì¹ê° ì´í ì¤íì ì¤ì§í©ëë¤
- í¨ê³¼: ë§¤ì¼ 9:00~17:00 ì¬ì´ì ìê°ë¹ í ë², ì´ 9í ì¤í
* 9-18 once * *
ì미:
- ë§¤ì¼ 9:00~18:59ê° íë³´ ìê°ì ëë¤
- ì¼ íëì
onceë 주기를 í루ì í ë²ì¼ë¡ ê³ ì í©ëë¤ - í루ì 첫 ì¼ì¹ í 18:59ê¹ì§ ì무ê²ë ì¤íëì§ ììµëë¤
@crontab ììâ
ì¼ë°â
//@crontab * * * * * // ë¶ë¹ í ë² ì¤í
//@crontab * * * * * * // ì´ë¹ í ë² ì¤í (ê¶ì¥íì§ ìì)
//@crontab 0 */6 * * * // 6ìê°ë§ë¤ ì ìì ì¤í
//@crontab 15 */6 * * * // 6ìê°ë§ë¤ 15ë¶ì ì¤í
//@crontab * once * * * // ìê°ë¹ ìµë í ë² ì¤í
//@crontab * * once * * // í루 ìµë í ë² ì¤í
//@crontab * 10 once * * // ë§¤ì¼ 10:00 ìê° ë´ì í ë²ë§ ì¤í (ì: 10:04ì ì¤íëë©´ 10:05-10:59ì ë¤ì ì¤íëì§ ìì)
//@crontab * */4 once * * // ë§¤ì¼ 4ìê°ë§ë¤ ìµë í ë² íì¸ (ì: 4:00ì ì¤íëë©´ 8, 12, 16, 20, 24 ë±ì ë¤ì ì¤íëì§ ìì)
ê³ ê¸â
//@crontab * 1,3,5 once * * // ë§¤ì¼ 1:00, 3:00 ëë 5:00ì í ë² ì¤í (ì: 1:00ì ì¤íëë©´ 3:00 ëë 5:00ì ë¤ì ì¤íëì§ ìì)
//@crontab * 10-23 once * * // ë§¤ì¼ 10:00~23:59 ì¬ì´ì í ë² ì¤í (ì: 10:04ì ì¤íëë©´ 10:05-23:59ì ë¤ì ì¤íëì§ ìì)
//@crontab * once 13 * * // 매ì 13ì¼ì ìê°ë¹ í ë² ì¤í
//@crontab * once(9-17) * * * // ë§¤ì¼ 9:00~17:00 ì¬ì´ì ìê°ë¹ í ë² ì¤í
//@crontab 0,30 once * * * // 매ìê° 0ë¶ ëë 30ë¶ ì¤ ë¨¼ì ì¼ì¹íë ê²ì´ ì¤íë¨; ê·¸ ìê°ìë ë°ë³µëì§ ìì
//@crontab * 9-18 once * * // ë§¤ì¼ 9:00~18:00 ì¬ì´ì í ë²ë§ ì¤í
ì¬ì© ê¶ì¥ ì¬íâ
onceì ì í©í ê²½ì°â
-
í루/ìê°ë¹ í ë²ë§ ì¤ííë©´ ëë ìì
-
ìí íì¸, ë기í ë° ë³´ê³ ì¤í¬ë¦½í¸
-
ë¤ì 문ì ë°©ì§:
- ë¸ë¼ì°ì ê° ì¤ë«ëì ì´ë¦¬ì§ ìì ê²½ì°
- 백그ë¼ì´ë íì´ì§ ìì½ ì§ì°
- ë¸ë¼ì°ì ë¤ì ììì¼ë¡ ì¸í ì¤ë³µ ì¤í
onceì ê¶ì¥ëì§ ìë ê²½ì°â
- ì íí ìì ì ì¤íí´ì¼ íë ìì
- ì¤í ìê°ì´ cron ê°ê²©ì í¬ê² ì´ê³¼í ì ìë ì¤í¬ë¦½í¸
- ì¤í íìì ëí ì격í ì¼ê´ì± ì구 ì¬íì´ ìë ìì
Cron ííì í ì¤í¸â
cron ííìì í
ì¤í¸í ëë once / once(...)ì ì¼ìì ì¼ë¡ 기본 ê°ì¼ë¡ ëì²´íì¸ì:
onceâ*once(expr)âexpr
í ì¤í¸ ëêµ¬ê° íì¥ 6íë íìì ì§ìíì§ ìì ì ììµëë¤.
ê¶ì¥ ë구:
ì¤í¬ë¦½í¸ ëª©ë¡ íì´ì§ìì ì¤í ìí ì´ ìì ë§ì°ì¤ë¥¼ ì¬ë¦¬ë©´ ì¤í¬ë¦½í¸ì ë¤ì ìì½ ì¤í ìê°ì ë³¼ ì ììµëë¤.
ë¡ê·¸â
ì¤í¬ë¦½í¸ ëª©ë¡ íì´ì§ìì ì¤í ìí ì´ ìì ë§ì°ì¤ë¥¼ ì¬ë¦¬ë©´ ì¤í¬ë¦½í¸ì ì¤í ìíê° ìë í´íì´ íìë©ëë¤.
í´ë¦íë©´ GM_logë¡ ì¶ë ¥ë ë¡ê·¸ ë´ì©ì´ íì
ì¼ë¡ íìë©ëë¤.

ì¤í¬ë¦½í¸ ëë²ê¹ â
백그ë¼ì´ë ì¤í¬ë¦½í¸ë ì¤í¬ë¦½í¸ í¸ì§ê¸° íì´ì§ìì ì§ì ëë²ê¹ í ì ìì§ë§ ë¤ìê³¼ ê°ì ì í ì¬íì´ ììµëë¤:
valueê° ì ëë¡ ë기íëì§ ììµëë¤registerMenuë©ë´ê° ì ëë¡ í¸ë¦¬ê±°ëì§ ììµëë¤

ì¤ì ë°íì íê²½ì ëë²ê¹
íë ¤ë©´ íì¥ íë¡ê·¸ë¨ ì¤ì ìì ê°ë°ì 모ë를 íì±íí ë¤ì íì¥ íë¡ê·¸ë¨ì background.html íì´ì§ë¥¼ ì´ì´ ëë²ê¹
íì¸ì.
ë°íììì ë°ìí ì¤ë¥ë ì¤í ë¡ê·¸ììë ë³¼ ì ììµëë¤.

Promiseâ
ë¤ì í¨í´ì ì ê·¹ ê¶ì¥í©ëë¤. ì¤í¬ë¦½í¸ ê´ë¦¬ìê° ì¤í¬ë¦½í¸ ì¤íì 모ëí°ë§í ìë ììµëë¤.
ì¤í¬ë¦½í¸ê° ë¹ë기 ìì
ì ìííë ê²½ì° Promise를 ë°íí´ì¼ í©ëë¤.
// ==UserScript==
// @name Background Script
// @namespace wyz
// @version 1.0.0
// @author wyz
// @background
// ==/UserScript==
return new Promise((resolve, reject) => {
if (Math.round((Math.random() * 10) % 2)) {
resolve("ok"); // ì±ê³µ
} else {
reject("error"); // ì¤í¨, ì¤ë¥ ì´ì í¬í¨
}
});
// ==UserScript==
// @name Scheduled script that runs once a day
// @namespace wyz
// @version 1.0.0
// @author wyz
// @crontab * * once * *
// ==/UserScript==
return new Promise((resolve, reject) => {
if (Math.round((Math.random() * 10) % 2)) {
resolve("ok"); // ì±ê³µ
} else {
reject("error"); // ì¤í¨, ì¤ë¥ ì´ì í¬í¨
}
});
// ==UserScript==
// @name Call an API
// @namespace wyz
// @version 1.0.0
// @author wyz
// @crontab * * once * *
// ==/UserScript==
return new Promise((resolve, reject) => {
GM_xmlhttpRequest({
url: "https://bbs.tampermonkey.net.cn/",
onload() {
resolve("ok"); // ì±ê³µ
},
onerror() {
reject("error"); // ì¤í¨, ì¤ë¥ ì´ì í¬í¨
},
});
});
resolve / reject를 ì¤í¬ë¦½í¸ ë¡ì§ì´ ì¤ì ë¡ ìë£ë íìë§ í¸ì¶íì¸ì.
í¸ì¶ í ê´ë¦¬ìë ì¤í¬ë¦½í¸ ì¤íì´ ìë£ë ê²ì¼ë¡ ê°ì£¼íë©° ì´íì GM ìì
ì ë ì´ì ì ì©ëì§ ììµëë¤.
ì¤ë¥ ì¬ìëâ
ScriptCat 백그ë¼ì´ë ì¤í¬ë¦½í¸ë ì¤ë¥ ì¬ìë를 ì§ìí©ëë¤.
ì¤í¬ë¦½í¸ê° ì¤í¨íë©´ CATRetryErrorë¡ rejectíì¬ ì¬ìë를 í¸ë¦¬ê±°í ì ììµëë¤.
- ìµì ì¬ìë ê°ê²©: 5ì´
- ì¤í¬ë¦½í¸ ìì²´ì ì¤í ìê°ê³¼ ì¶©ëíì§ ìëë¡ íì¸ì. ê·¸ë ì§ ìì¼ë©´ ì¤ë³µ ì¤íì´ ë°ìí ì ììµëë¤
// ==UserScript==
// @name Retry example
// @namespace https://bbs.tampermonkey.net.cn/
// @version 0.1.0
// @description try to take over the world!
// @author You
// @crontab * * once * *
// @grant GM_notification
// ==/UserScript==
return new Promise((resolve, reject) => {
GM_notification({
title: "retry",
text: "Retrying in 10 seconds",
});
reject(new CATRetryError("xxx error", 10));
});