Crontab avec ed par des commandes sur les flux, les résultats en "pas de modification"

0

La question

Je suis en train d'ajouter une ligne à mon fichier crontab. Je sais qu'il y a d'autres façons de contourner ce problème, mais toujours envie de savoir ce qui a causé il. La commande est exécutée sur raspberry pi 3 B+, raspbian lite est installé, avec GNU ed 1.15, cron 3.0pl1-134+deb10u1.

La commande que je suis coincé sur cette:

$ echo -e 'a\n#asdf\n.\nwQ' | EDITOR=ed crontab -e
902
909
No modification made

Je suis en espérant que cela, ajoutez la ligne #asdf à la fin de mon fichier crontab, mais il ne le fait pas.

Réglage EDITOR='tee -a' comme l'a suggéré sur https://stackoverflow.com/a/30123606/8842387 ne permet pas de résoudre le problème. Donc je suppose que c'est le problème avec cron.

Assez étrangement, quand je donne ed commandes à partir du clavier directement, plutôt que de les diffuser, il fonctionne, tout simplement. Peut-être que shell interne est exécuté création cause de ce problème?

Ici, je suis attacher un peu des dernières lignes de strace résultat.

$ echo -e 'a\n#asdf\n.\nwQ' | EDITOR=ed strace crontab -e
execve("/usr/bin/crontab", ["crontab", "-e"], 0x7ee54c14 /* 29 vars */) = 0
access("/etc/suid-debug", F_OK)         = -1 ENOENT (No such file or directory)
...
read(3, "TZif2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\0\0\0\7\0\0\0\0"..., 4096) = 659
_llseek(3, -393, [266], SEEK_CUR)       = 0
read(3, "TZif2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\0\0\0\7\0\0\0\0"..., 4096) = 393
close(3)                                = 0
getpid()                                = 18579
socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0) = 3
connect(3, {sa_family=AF_UNIX, sun_path="/dev/log"}, 110) = 0
send(3, "<78>Nov 20 15:31:25 crontab[1857"..., 56, MSG_NOSIGNAL) = 56
openat(AT_FDCWD, "crontabs/pi", O_RDONLY) = -1 EACCES (Permission denied)
openat(AT_FDCWD, "/usr/share/locale/locale.alias", O_RDONLY|O_CLOEXEC) = 4
fstat64(4, {st_mode=S_IFREG|0644, st_size=2995, ...}) = 0
read(4, "# Locale name alias data base.\n#"..., 4096) = 2995
read(4, "", 4096)                       = 0
close(4)                                = 0
openat(AT_FDCWD, "/usr/share/locale/en_GB.UTF-8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale/en_GB.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale/en_GB/LC_MESSAGES/libc.mo", O_RDONLY) = 4
fstat64(4, {st_mode=S_IFREG|0644, st_size=1433, ...}) = 0
mmap2(NULL, 1433, PROT_READ, MAP_PRIVATE, 4, 0) = 0x76f50000
close(4)                                = 0
openat(AT_FDCWD, "/usr/share/locale/en.UTF-8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale/en.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale/en/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
write(2, "crontabs/pi/: fdopen: Permission"..., 39crontabs/pi/: fdopen: Permission denied) = 39
exit_group(1)                           = ?
+++ exited with 1 +++

openat(AT_FDCWD, "crontabs/pi", O_RDONLY) = -1 EACCES (Permission denied) l'air un peu suspect, mais vous ne savez pas pourquoi il ouvre le fichier en lecture seule.

EDIT: Comme suggéré par @tink, j'ai couru EDITOR=ed strace crontab -e pour voir ce que strace donne sur une session interactive. Le résultat était presque le même (seule variable sur les pid et fd numéros).

J'ai remarqué que l'exécution de echo "..." | EDITOR=ed crontab -e terminé avec le message No modification made mais avec strace le processus s'arrête sans aucun message. (EDITOR=ed strace crontab -e 2>&1 | grep "No mod" imprime rien). Deviner le strace déclenche des erreurs différentes.

bash cron ed linux
2021-11-20 06:41:51
1

La meilleure réponse

0

Suite à mon VISUAL commentaire, ces fonctionné pour moi:

( unset VISUAL; printf '%s\n' a '#abcd' . wq | EDITOR=ed crontab -e )
printf '%s\n' a '#abcd' . wq | VISUAL=ed crontab -e

Dans mon environnement, à la fois VISUEL et ÉDITEUR sont mis à "vim"

Ou, plus rond-point, mais n'avez pas besoin de singe avec env vars. Ce qui vous permet de le faire en silence:

crontab <(printf '%s\n' a '#asdf' . '%p' | ed -s <(crontab -l))

Je faisais le ci-dessus sur un Mac. Sur Linux, je peux reproduire vos observations, mais ne peut pas les expliquer.

Un petit tweak pour la dernière commande fonctionne:

printf '%s\n' a '#asdf' . '%p' Q | ed -s <(crontab -l) | crontab -
2021-11-21 20:34:51

Merci pour la réponse! J'ai peur de dire qu'aucun des deux lignes ci-dessus a travaillé pour moi et le dernier donne /dev/fd/63: Not a regular file. Peut-être que certains de configuration du système d'être différent?
bivoje

Dans d'autres langues

Cette page est dans d'autres langues

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................